DateTime-Vergleich in Oracle
Mache ich einen Vergleich zwischen mehreren Terminen in meiner gespeicherten Prozedur.
TODAY := TO_DATE(TO_CHAR(SYSDATE, 'DD-MON-YYYY') ||
' 09:00:00', 'DD-MON-YYYY HH24:MI:SS');
IF PREVIOUS_DATE < TODAY AND
TO_DATE(CURRENT_DATE, 'DD-MON-YYYY HH24:MI:SS') >= TODAY THEN
-- do something
ELSE
-- do something else
Wenn ich CURRENT_DATE = SYSDATE
es nicht in die IF
Teil. Kann mir jemand sagen, wo habe ich falsch gemacht?
- Warum willst du konvertieren
SYSDATE
erste, um ein zeichenliteral ist einfach es zu konvertieren zurück zu einemDATE
danach? Dies ist völlig nutzlos und wegen derMON
format zum scheitern verurteilt in verschiedenen NLS-Umgebungen.today := sysdate
ist viel sicherer und korrigieren sowie. Und Umwandlung einesCURRENT_DATE
ist einen Termin zu einerDATE
mitto_date()
nutzlos ist genauso gut. - Ich Stimme zwar voll und ganz, dass 'MO' als Teil einer Maske format sollte wenn immer möglich vermieden werden, in diesem Fall, sollte es in jedem NLS-Einstellung seit der OP ist mit MON konsequent (es sei denn, der hin-und her-Konvertierungen durchgeführt werden, in einer anderen Sitzung mit unterschiedlichen NLS-Einstellungen) - oder täusche ich mich?
- sorry für die parameter CURRENT_DATE, ich habe nicht bemerkt, es ist eine Funktion in oracle, meinem eigentlichen parameter name ist CUR_DATE, nur um deutlich zu machen, damit ich umschreiben, dass es mit CURRENT_DATE
- Aber trotzdem: die Umwandlung der DATEPART-hin und her macht keinen Sinn.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, dass die speigatte meine erste Idee 😎
Aber ich denke, das problem ist bei der Verwendung vonCURRENT_DATE
. Unter der Annahme, dass die Oracle-Funktion gibt es zwei mögliche Probleme:CURRENT_DATE gibt einen Wert eingestellt, der für die system-Zeitzone. Das ist vermutlich die Stelle des IF-test. Aber wissen Sie, was die Werte sind?Aber es bleibt eine einfache debugging-Aufgabe. Überprüfen Sie Ihre Werte zu verstehen, was geschieht. Hier ist ein Beispiel mit DBMS_OUTPUT (AKA The Devil ' s Debugger), weil ich weiß nicht, ob Sie arbeiten in einem Umfeld mit besseren tools.
Könnte genauso gut den code vereinfachen gleichzeitig.
Denken Sie daran, zu sehen, die Ausgabe von DBMS_OUTPUT.PUT_LINE Sie brauchen, um SET SERVEROUTPUT AUF, für welchen client Sie verwenden.
Übrigens, es ist eine schlechte Praxis, um Variablen zu deklarieren, die denselben Namen wie die Oracle built-ins. Dies ist, warum es eine gute Idee, fügen Sie eine scoping-Präfix (
l_
für lokale,p_
für parameter, etc), um unsere Erklärungen. Wir don ' T haben, um die volle Ungarisch zu bekommen eine Menge von Vorteil.CURRENT_DATE
ist vom Typ VARCHAR2 und erhält input wie24-APR-2013 16:15:17
btw, nie bemerken die trunc-Funktion vor, die es vereinfacht meinen code viel. danke.()
? Ich denke, wenn Sie Ihre eigene Funktion erstellen, namenscurrent_date
der einzige Weg, um es zu verwenden wäre:current_date()