web-dev-qa-db-fra.com

Moyen courant de comparer l'horodatage dans Oracle, PostgreSQL et SQL Server

J'écris une requête SQL qui consiste à déterminer si l'horodatage tombe dans une plage de jours particulière. 

Je l'ai écrit dans PostgreSQL mais cela ne fonctionne pas dans Oracle et SQL Server:

AND creation_date < (CURRENT_TIMESTAMP - interval '5 days')
AND creation_date >= (CURRENT_TIMESTAMP - interval '15 days')

Existe-t-il un moyen courant de comparer l'horodatage entre différentes bases de données?

19
Pratik Garg

Je ne suis pas un expert de SQL Server, mais je sais que cela fonctionne sur Oracle et Postgres et je suppose que cela pourrait fonctionner sur MSSQL, mais je n'ai aucun moyen de le tester.

AND creation_date < (CURRENT_TIMESTAMP - interval '5' day)
AND creation_date >= (CURRENT_TIMESTAMP - interval '15' day)

Ou si vous utilisez le type de date au lieu de l'horodatage, vous pouvez le faire, mais je suis sûr que cela ne fonctionnerait pas avec MSSQL. Et le type DATE est assez différent entre Oracle et Pg.

AND creation_date < CURRENT_DATE - 5
AND creation_date >= CURRENT_DATE - 15

Comme indiqué dans les commentaires de OMG Ponies, vous ne pouvez ajouter que des entrées aux types Date et non aux horodatages. (Oracle lance silencieusement l'horodatage à ce jour)

17
Scott Bailey

Comment comparer deux horodatages dans postgresql, les valeurs suivantes sont vraies:

select to_timestamp('2010-01-01 10:10:85.123', 'YYYY-MM-dd HH:MI:SS.MS') <
    to_timestamp('2012-01-01 10:10:85.123', 'YYYY-MM-dd HH:MI:SS.MS');

Renvoie true car le 2012 est après le 2010

7
Eric Leschinski

Je ne crois pas qu'il existe une syntaxe commune qui fonctionne sur tous les moteurs de base de données. Dans SQL Server, vous procédez comme suit:

AND creation_date BETWEEN DateAdd(dd, -5, GetUtcDate()) AND DateAdd(dd, -15, GetUtcDate())

Je ne suis pas sûr pour Oracle ...

3
Dean Harding

Oracle (J'ai testé ces deux solutions):

AND (creation_date BETWEEN sysdate-15 AND sysdate-6)

Cette syntaxe est également valide:

AND (creation_date BETWEEN current_timestamp - INTERVAL '15' DAY 
                       AND current_timestamp - INTERVAL '6' DAY)

Notez que SYSDATE et CURRENT_TIMESTAMP sont synonymes (en quelque sorte - voir les commentaires). 

Notez que BETWEEN renvoie les valeurs inclusive des limites. Puisque vous recherchez des valeurs qui sont>=date-15 mais<date-5, vous devez spécifier -15 à -6 lorsque vous utilisez BETWEEN. Les réponses utilisant une borne supérieure de -5 avec une expression BETWEEN sont incorrectes.

1
Igby Largeman
select * from timing where (db_time < CURRENT_DATE) AND (db_time > (CURRENT_DATE - INTERVAL '1' DAY)) ;
0
Usman

Encore une fois, ceci est spécifique à Oracle, supposez que l'intime est le type de données TIMESTAMP (3), vous pouvez le faire

select * from MYTABLE where intime >= to_timestamp('2014-10-01 7:00:56', 'YYYY-MM-dd HH24:MI:SS')
0
Jonathan L