2010-01-10 5 views
11

utilisant un db Oracle 10g j'ai une table quelque chose comme ceci:plage de dates oracle

create table x(
ID NUMBER(10) primary key, 
wedding DATE NOT NULL 
); 

comment puis-je

select * from x where wedding is in june 2008??? 

Je sais qu'il est probablement facile mais je ne pouvais pas trouver toute réponse satisfaisante jusqu'à présent. L'aide est très appréciée.

Répondre

19

Utilisation:

SELECT * 
    FROM x 
WHERE x.wedding BETWEEN TO_DATE('2008-JUN-01', 'YYYY-MON-DD') 
          AND TO_DATE('2008-JUL-01', 'YYYY-MON-DD') 

Utilisation de TO_DATE construit une date avec une partie de temps 00:00:00, ce qui nécessite la date de fin d'être un jour d'avance, sauf si vous souhaitez utiliser la logique pour corriger le courant date à une seconde avant minuit. Non testé:

TO_DATE('2008-JUN-30', 'YYYY-MON-DD') + 1 - (1/(24*60*60)) 

Cela devrait ajouter un jour à 30 juin 2008, puis soustraire un second pour revenir à une date finale de 30-Jun-2008 23:59.

Références:

+2

Le type DATE dans ORACLE contient le composant de date et d'heure. L'expression TO_DATE ('2008-JUN-30', 'YYYY-MON-DD') équivaut à '2008-JUN-30 00:00:00'. Si les données contiennent des informations sur l'heure, vous pouvez rencontrer des problèmes avec cette expression. Mariage qui se passe sur '2008-JUN-30 16:00:00' (16 heures), ne sera pas dans l'ensemble des résultats de la requête ci-dessus. – zendar

+1

donc je devrais le mettre à entre 01 Juin et 01 Juillet. – Hoax

+0

Re "Utilisation de TO_DATE ..." - Je suis d'accord que c'est un peu plus compliqué si vous avez l'heure et la date ensemble. Votre limite supérieure actuelle: 'TO_DATE ('2008-JUL-01', 'YYYY-MON-DD')' peut maintenant obtenir des mariages de 2008-JUL-01 qui n'ont pas d'heure entrée (je présume qu'il n'y a pas de minuit mariages), donc cette requête peut être inexacte à. Vous avez probablement besoin d'élaborer des cas de bord et d'ajouter quelques commentaires sur la partie temps et l'opérateur BETWEEN. – zendar

2

Ceci est ANSI SQL, et pris en charge par Oracle de la version 9i

SELECT * 
FROM x 
WHERE EXTRACT(YEAR FROM wedding) = 2008 
AND EXTRACT(MONTH FROM wedding) = 06 

solution classique avec oracle spécifique TO_CHAR():

SELECT * 
FROM x 
WHERE TO_CHAR(wedding, 'YYYY-MMM') = '2008-JUN' 

+2

Ni utilisera un index (s'il en existe un) sur la colonne 'mariage'. –

+0

En outre, si les erreurs PLW sont activées, les deux options entraîneront une conversion à l'écart de l'erreur de type de données. –

+0

@OMG Poneys - oui, vous avez raison. La solution entre est beaucoup mieux pour la performance. Je ne sais pas exactement ce que vous voulez dire par les erreurs PLW. Avez-vous un pointeur pour moi? TIA –