Frage Gemeinsame Methode zum Vergleichen von Zeitstempeln in Oracle, PostgreSQL und SQL Server


Ich schreibe eine SQL-Abfrage, bei der festgestellt wird, ob der Zeitstempel in einen bestimmten Bereich von Tagen fällt.

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 Möglichkeit, den Zeitstempel über verschiedene Datenbanken hinweg zu vergleichen?


19
2018-03-24 04:43


Ursprung


Antworten:


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

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

Oder wenn Sie den Datumstyp anstelle des Zeitstempels verwenden, können Sie dies tun, aber ich bin mir ziemlich sicher, dass es bei MSSQL nicht funktioniert. Und der DATE-Typ ist ziemlich unterschiedlich zwischen Oracle und Pg.

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

Wie in den Kommentaren zu OMG-Ponys angemerkt wurde, können Sie nur Datumstypen und keine Zeitstempel hinzufügen. (Oracle überträgt den Zeitstempel stillschweigend bis heute)


17
2018-03-24 06:48



Wie man zwei Zeitstempel in postgresql vergleicht, gibt das folgende zurück wahr:

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, weil der 2012 ist nach dem 2010


7
2017-10-23 22:20



Ich glaube nicht, dass es eine gemeinsame Syntax gibt, die für alle Datenbank-Engines funktioniert. In SQL Server machen Sie es so:

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

Ich bin mir nicht sicher über Oracle ...


3
2018-03-24 04:46



Orakel (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 synonym sind (sort of - siehe Kommentare).

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


1
2018-03-24 04:51



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

0
2017-08-29 10:39



Auch dies ist spezifisch für Oracle, angenommen, intime ist TIMESTAMP (3) Datentyp, können Sie dies tun

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

0
2017-12-06 20:35