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?
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)
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
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 ...
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.
select * from timing where (db_time < CURRENT_DATE) AND (db_time > (CURRENT_DATE - INTERVAL '1' DAY)) ;
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')