2010-11-03 2 views
1

J'ai une colonne DATE avec une date mais j'ai besoin de l'interroger pour trouver des enregistrements datant de moins de 30 jours.Oracle SQL Where Clause par rapport à une colonne de date

START_DATE 
---------- 
01-AUG-2010 
09-AUG-2010 
22-AUG-2010 
09-SEP-2010 

Requête:

SELECT START_DATE 
WHERE START_DATE < 30; 

Je sais qu'il est simple requête SQL dans Oracle, mais je suis en train de faire quelque chose de mal.

+1

duplication possible de [clause SQL Oracle Where pour trouver les enregistrements de date de plus de 30 jours] (http://stackoverflow.com/questions/3860295/oracle-sql-where-clause-to-find-date-records-older -than-30-days) – APC

Répondre

-1

OÙ START_DATE> SYSDATE - 1

ou peut-être

OÙ TRIM (STARTDATE)> TRIM (SYSDATE) - 1

+1

Je pense qu'Oracle ajoute (ou soustrait) un nombre à une date ajoute beaucoup de * jours *, donc vous venez de soustraire 1 jour de sysdate En outre, je ne suis pas sûr pourquoi vous couperiez sysdate. – FrustratedWithFormsDesigner

+1

@FrustratedWithFormsDesigner: Je pense qu'il voulait dire TRUNC, mais ce n'est pas bon de courir contre la colonne de la table. –

+0

Oui, à droite 1 1 au lieu de 30 :) – maximdim

6

Utilisation:

SELECT t.start_date 
    FROM YOUR_TABLE t 
WHERE t.start_date > SYSDATE - 30 
  • SYSDATE est la syntaxe d'Oracle pour obtenir la date et l'heure
  • Dans Oracle, vous pouvez faire des calculs de dates dans le contexte des jours, si SYSDATE - 30 signifie « courant date, soustraire trente jours "pour obtenir une date qui est de trente jours dans le passé

Si vous voulez évaluer la date basée sur trente jours à partir de minuit, utilisez le TRUNC function:

SELECT t.start_date 
    FROM YOUR_TABLE t 
WHERE t.start_date > TRUNC(SYSDATE) - 30 

Ne pas exécuter TRONQUE sur la colonne - qui rendra un index sur la colonne inutile, assurant un balayage de table.

+1

Alternativement, vous pouvez essayer 'where months_between (sysdate, t.start_date) <= 1'. Bien que je pense que vous pourriez obtenir des résultats légèrement différents, en fonction de la durée des mois en question. 'mois_between' existe sur Oracle, mais je ne sais pas si d'autres bases de données implémentent des fonctionnalités similaires. – FrustratedWithFormsDesigner

+0

@FrustratedWithFormsDesigner: Vrai, mais ajouter/soustraire un mois n'est pas garanti être trente jours - IE soustrait un mois du 29 mars ... :) –

+0

True. Parfois, les exigences disent "3 mois avant ..." et parfois ils disent "90 jours avant ..." et certaines personnes semblent penser qu'elles sont équivalentes alors elles en disent une quand elles signifient l'autre. Donc, je code à une norme seulement pour découvrir qu'ils l'ont signifié dans l'autre sens ... – FrustratedWithFormsDesigner

3
SELECT t.start_date 
    FROM YOUR_TABLE t 
WHERE t.start_date > SYSDATE - INTERVAL '30' DAY; 

INTERVAL est plus portable que de supposer que vous pouvez ajouter ou soustraire des jours, bien que j'ai remarqué quelques légères différences dans la syntaxe INTERVAL entre Oracle et PostgreSQL.

+2

La gestion de la date n'est malheureusement pas très portable entre les bases de données. –