2009-07-13 8 views
51

Je dois ajouter l'année en cours en tant que variable dans une instruction SQL, comment puis-je récupérer l'année en cours en utilisant SQL?Comment obtenir l'année en cours en utilisant SQL sur Oracle?

-à-dire

 
    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') 

Répondre

81

Avec to_char:

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

Dans votre exemple, vous pouvez utiliser quelque chose comme:

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

Les valeurs de comparaison sont exactement ce que vous demande:

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

Merci, grâce à votre réponse, j'ai pu créer le SQL dont j'avais besoin pour plusieurs requêtes différentes! –

+3

La sous-traitance d'une seconde de l'année suivante pour obtenir la dernière seconde de cette année fonctionnera pour les dates et l'horodatage présumable sans fraction de seconde. Si vous vous retrouvez avec des horodatages et des secondes fractionnaires, alors certaines valeurs pourraient être dans l'année en cours, et manqués par le 'entre et - 1 seconde'. En utilisant différents RDBMS qui ont chacun plusieurs types date/heure avec des précisions différentes, je recommande et préfère 'start_of_this_year <= value_under_test et value_under_test <'start_of_next_year' –

52

Une autre option est:

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

Ceci, combiné à un index basé sur une fonction, rendrait la requête relativement rapide. –

+1

L'index basé sur la fonction ajouterait une complexité inutile ici. Pourquoi utiliser le FBI quand vous pouvez faire avec un index simple? – jva

+1

Un index simple sur date_field ne sera pas utilisé si une fonction (comme EXTRACT) est appliquée à la colonne (testée sur Oracle 11g) - ce serait bien si c'était le cas. Un index basé sur la fonction sur EXTRACT (YEAR FROM date_field) peut cependant être utilisé. –

13

Utilisez la fonction extract(datetime) il est si facile, simple.

Il retourne l'année, mois, jour, minute, seconde

Exemple:

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

La fonction 'extract' extrait uniquement l'année, le mois et le jour d'un champ de type' datetime' (comme 'sysdate'). Il va extraire les autres champs d'un champ 'timestamp' cependant. – Gerrat

-5

Pour afficher la date actuelle du système dans l'oracle-sql

select sysdate from dual; 
+3

Afficher la date actuelle n'était pas la question. –

0

Une autre option serait :

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

Sélectionnez TO_CHAR (SYSDATE, 'YYYY') à partir du dual;

+1

Correct mais c'est déjà la meilleure réponse, à partir de 2013. –

1

Puisque nous faisons un à mort - vous ne devez pas spécifier un an:

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'); 

Cependant, la réponse acceptée par FerranB est plus logique si vous voulez spécifier toutes les valeurs de date qui relèvent de l'année en cours.

Questions connexes