it-swarm.com.de

Allgemeine Methode zum Vergleichen von Zeitmarken in Oracle, PostgreSQL und SQL Server

Ich schreibe eine SQL-Abfrage, bei der ermittelt wird, ob der Zeitstempel in einem bestimmten Bereich von Tagen liegt. 

Ich habe das in PostgreSQL geschrieben, aber es funktioniert nicht in Oracle und SQL Server:

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

Gibt es eine gängige Methode, um den Zeitstempel zwischen verschiedenen Datenbanken zu vergleichen?

19
Pratik Garg

Ich bin kein SQL Server-Experte, aber ich weiß, dass dies für Oracle und Postgres funktioniert, und ich vermute, dass es für MSSQL funktioniert, aber ich habe keine Möglichkeit, es an ATM zu testen.

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

Wenn Sie statt eines Zeitstempels den Datumstyp verwenden, können Sie dies tun, aber ich bin mir ziemlich sicher, dass es nicht mit MSSQL funktionieren würde. Und der Typ DATE unterscheidet sich zwischen Oracle und Pg.

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

Wie bereits in den Kommentaren für OMG Ponys erwähnt, können Sie Datumsarten nicht Zeitstempel hinzufügen. (Oracle wirft den aktuellen Zeitstempel lautlos um)

17
Scott Bailey

Wenn Sie zwei Zeitmarken in Postgresql vergleichen, wird Folgendes zurückgegeben:

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');

Gibt true zurück, da der 2012 hinter dem 2010 liegt.

7
Eric Leschinski

Ich glaube nicht, dass es eine allgemeine Syntax gibt, die für alle Datenbankmodule geeignet ist. In SQL Server machen Sie das so:

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

Ich bin mir bei Oracle nicht sicher ...

3
Dean Harding

Oracle (Ich habe beide Lösungen getestet):

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

Diese Syntax ist auch gültig:

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

Beachten Sie, dass SYSDATE und CURRENT_TIMESTAMP gleichbedeutend sind (Art - siehe Kommentare). 

Beachten Sie, dass BETWEEN Werte inklusive der Grenzen zurückgibt. Da Sie nach Werten suchen, die>=date-15 aber<date-5 sind, müssen Sie bei Verwendung von BETWEEN -15 bis -6 angeben. Die Antworten, die eine obere Grenze von -5 mit einem Ausdruck zwischen verwenden, sind falsch.

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

Dies ist wiederum spezifisch für Oracle. Angenommen, intime ist vom Datentyp TIMESTAMP (3)

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