74 votes

Comment obtenir l'année en cours en utilisant SQL sur Oracle ?

J'ai besoin d'ajouter l'année en cours comme variable dans une instruction SQL, comment puis-je récupérer l'année en cours en utilisant SQL ?

c'est-à-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')

123voto

FerranB Points 9532

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 celles que vous demandez :

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

4 votes

Le sous-traitement d'une seconde de l'année suivante pour obtenir la dernière seconde de cette année fonctionnera pour les dates et les timestamp présumés sans fraction de seconde. Si vous vous retrouvez avec des horodatages et des fractions de seconde, certaines valeurs peuvent se trouver dans l'année en cours et ne pas être prises en compte par la fonction de recherche de l'année suivante. between <begin this year> and <end next year> - 1 second . En travaillant sur différents SGBDR qui ont chacun plusieurs types de date/heure avec des précisions différentes, je recommande et préfère start_of_this_year <= value_under_test and value_under_test < 'start_of_next_year

0 votes

@ShannonSeverance Ce serait facile à mal interpréter. Pour être clair, la requête de FerranB fonctionne - il n'y a pas de risque que des fractions de secondes la gâchent. Ce que vous décrivez est une solution alternative générale qui fonctionne avec des timestamps aussi bien que des dates. (Je ne dis pas que vous avez prétendu le contraire... je le souligne simplement pour les lecteurs qui pourraient se faire une fausse idée). Votre commentaire pourrait mieux fonctionner en tant que réponse séparée puisque le risque que vous mentionnez ne s'applique pas à la requête de FerranB.

68voto

borjab Points 1839

Une autre option est :

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

3 votes

Ceci, combiné à un index basé sur des fonctions, rendrait la requête assez rapide.

1 votes

Un index basé sur une fonction ajouterait ici une complexité inutile. Pourquoi utiliser le FBI quand on peut se contenter d'un simple index ?

2 votes

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

18voto

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

Il renvoie l'année, le mois, le jour, les minutes, les secondes.

Exemple :

select extract(year from sysdate) from dual;

1 votes

extract n'extraira que l'année, le mois et le jour d'un fichier de données. datetime champ de type (comme sysdate ). Il extraira les autres champs d'un timestamp Mais il y a aussi le terrain.

3voto

David Faber Points 2358

Une autre option encore serait :

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

1voto

Puisqu'il s'agit d'une opération à mort, il n'est pas nécessaire de préciser une année :

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 tombent dans l'année en cours.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X