2016-11-19 2 views
0

comapre Ich möchte die Zeitstempel Spalten Werte mit dem sysedernstamp Wert vergleichen. Meine Tabelle enthält zwei Spalten from_date und to_date mit dem Datentyp timestamp (6). Ich möchte so etwas wie diesesWie Zeitstempel (6) Spalten mit systimestamp in Orakel

  1. SYSTIMESTAMP zwischen from_date überprüfen und

Beim Check SYSTIMESTAMP thru_date Wert mit Zeitzone zurückkehrt aber from_date und thru_date Spalten Werte sind ohne Zeitzone

wählen SYSTIMESTAMP von Dual; - 2016.11.19 03: 35: 55,042420000 PM +08: 00

Und from_date & thru_date wie 2015.08.03 06: 09: 56,941255000 AM

Bitte geben Sie mir, wie kann ich erreichen, dieser Vergleich? Kann ich LOCALTIMESTAMP anstelle von SYSTIMESTAMP verwenden? Oder muss ich die Funktion from_tz für die Spalten from_date und to_date vor dem Vergleich verwenden?

Dank

+0

Sind diese Spalten lokale Zeiten? Wenn ja, können Sie LOCALTIMESTAMP verwenden. –

+0

Keine dieser Spalten enthält die Serverzeitzone mal –

Antwort

1

Für einen Vergleich hat Oracle eine implizite Umwandlung auszuführen. Ich habe gerade einen Test und Oracle läuft intern

systimestamp between CAST(from_date AS TIMESTAMP WITH TIME ZONE) and CAST(thru_date AS TIMESTAMP WITH TIME ZONE),

, die

entspricht systimestamp between FROM_TZ(from_date, SESSIONTIMEZONE) and FROM_TZ(thru_date, SESSIONTIMEZONE)

Falls Ihre aktuellen SESSIONTIMEZONE die Abfrage von Zeitzone des Datenbankservers Betriebssystem unterscheidet wird falsches Ergebnis zurückgeben.

Um ein korrektes Ergebnis erhalten Sie eine dieser Ausdrücke verwenden:

CAST(systimestamp AS TIMESTAMP) between from_date and thru_date 

systimestamp between FROM_TZ(from_date, EXTRACT(TIMEZONE_REGION FROM SYSTIMESTAMP)) 
     and FROM_TZ(thru_date, EXTRACT(TIMEZONE_REGION FROM SYSTIMESTAMP)) 

systimestamp between FROM_TZ(from_date, TO_CHAR(SYSTIMESTAMP, 'TZR')) 
     and FROM_TZ(thru_date, TO_CHAR(SYSTIMESTAMP, 'TZR')) 

systimestamp between FROM_TZ(from_date, TO_CHAR(SYSTIMESTAMP, 'TZH:TZM')) 
     and FROM_TZ(thru_date, TO_CHAR(SYSTIMESTAMP, 'TZH:TZM')) 

EXTRACT(TIMEZONE_REGION FROM SYSTIMESTAMP) fehlschlagen kann, je nach Servereinstellungen.

Hinweis: Verwenden Sie nicht DBTIMEZONE statt TO_CHAR(SYSTIMESTAMP, 'TZR'). DBTIMEZONE kann sich von der Zeitzone des Betriebssystems des Datenbankservers unterscheiden. Die Zeitzone SYSTIMESTAMP ist in der Zeitzone des Betriebssystems des Datenbankservers angegeben, nicht DBTIMEZONE!

+0

Können Sie diesen Punkt erklären - EXTRACT (TIMEZONE_REGION FROM SYSTIMESTAMP) oder TO_CHAR (SYSTIMESTAMP, 'TZR') möglicherweise fehl, je nach Ihren Servereinstellungen. –

+0

'TO_CHAR (SYSTIMESTAMP, 'TZR')' sollte in jedem Fall funktionieren. Normalerweise wird die Zeitzone des Betriebssystems in UTC-Offset angegeben, nicht als Region (zumindest in unseren Räumlichkeiten). 'SELECT EXTRACT (TIMEZONE_REGION VON SYSTIMESTAMP) FROM dual;' gibt 'UNKNOWN' zurück, was natürlich nicht funktioniert. –

Verwandte Themen