2009-07-13 18 views
51

È necessario aggiungere l'anno corrente come variabile in un'istruzione SQL, come posso recuperare l'anno corrente utilizzando SQL?Come ottengo l'anno corrente usando SQL su Oracle?

cioè

 
    BETWEEN 
    TO_DATE('01/01/**currentYear** 00:00:00', 'DD/MM/YYYY HH24:MI:SS') 
    AND 
    TO_DATE('31/12/**currentYear** 23:59:59', 'DD/MM/YYYY HH24:MI:SS') 

risposta

81

Con to_char:

select to_char(sysdate, 'YYYY') from dual; 

Nel tuo esempio si può usare qualcosa di simile a:

BETWEEN trunc(sysdate, 'YEAR') 
    AND add_months(trunc(sysdate, 'YEAR'), 12)-1/24/60/60; 

I valori confronto sono esattamente ciò che si richiede:

select trunc(sysdate, 'YEAR') begin_year 
    , add_months(trunc(sysdate, 'YEAR'), 12)-1/24/60/60 last_second_year 
from dual; 

BEGIN_YEAR LAST_SECOND_YEAR 
----------- ---------------- 
01/01/2009 31/12/2009 
+0

Grazie, grazie alla tua risposta sono stato in grado di creare l'SQL di cui avevo bisogno per diverse query diverse! –

+3

La sottotrama di un secondo dal prossimo anno per ottenere l'ultimo secondo di quest'anno funzionerà per le date e il timestamp presumibile senza secondi frazionari. Se si ottengono timestamp e secondi frazionari, alcuni valori potrebbero essere compresi nell'anno corrente e mancare per il periodo tra e - 1 second'. Lavorando su diversi RDBMS che hanno diversi tipi di data/ora con diverse precisioni consiglio e preferisco 'start_of_this_year <= value_under_test e value_under_test <'start_of_next_year' –

52

Un'altra opzione è:

SELECT * 
    FROM TABLE 
WHERE EXTRACT(YEAR FROM date_field) = EXTRACT(YEAR FROM sysdate) 
+2

Questo, combinato con un indice basato su funzione renderebbe la query abbastanza veloce. –

+1

L'indice basato sulla funzione aggiungerebbe qui complessità non necessaria. Perché usare l'FBI quando puoi fare con un indice semplice? – jva

+1

Un semplice indice su date_field non verrà usato se una funzione (come EXTRACT) è applicata alla colonna (testata su Oracle 11g) - sarebbe bello se lo facesse comunque. Tuttavia, è possibile utilizzare un indice basato su funzione su EXTRACT (ANNO FROM data_field). –

13

Usa extract(datetime) funzione è così facile, semplice.

Esso restituisce l'anno, mese, giorno, minuto, secondo

Esempio:

select extract(year from sysdate) from dual; 
+1

La funzione 'extract' estrae solo anno, mese e giorno da un campo di tipo' datetime' (come 'sysdate'). Però estrarrà gli altri campi da un campo 'timestamp'. – Gerrat

-5

per visualizzare la data corrente del sistema in Oracle-SQL

select sysdate from dual; 
+3

La visualizzazione della data corrente non era la domanda. –

0

Un'altra opzione sarebbe :

SELECT * FROM mytable 
WHERE TRUNC(mydate, 'YEAR') = TRUNC(SYSDATE, 'YEAR'); 
0

Selezionare TO_CHAR (SYSDATE,'YYYY ') da dual;

+1

Corretto ma questa è già la risposta migliore, dal 2013. –

1

Dal momento che stiamo facendo questo per la morte - non c'è bisogno di specificare un anno:

select * from demo 
where somedate between to_date('01/01 00:00:00', 'DD/MM HH24:MI:SS') 
       and  to_date('31/12 23:59:59', 'DD/MM HH24:MI:SS'); 

Tuttavia la risposta accettata dalla FerranB ha più senso se si desidera specificare tutti i valori di data che rientrano l'anno in corso.

Problemi correlati