Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Sql-Datums- und Zeitvergleich aus der Doppeltabelle

Okay, ich glaube, ich habe dich. Möchten Sie Folgendes tun?

select <columns>
  from my_table
 where state_date <= <some date>
   and state_time <= <some time>

Es ist ziemlich ungewöhnlich, sich um die Millisekunden zu kümmern, aber wenn Sie dies tun, sollten Sie systimestamp verwenden .

Der Tatsache nach zu urteilen, dass Sie Datum und Uhrzeit aufgeteilt haben, handelt es sich um Zeichen. Also muss ich die Masken formatieren . Wenn sie falsch liegen, sollte der Link Ihnen zeigen, was zu tun ist. Es ist übrigens nicht ratsam, ein Date auf diese Weise aufzuteilen. Sie könnten eine Spalte mit dem timestamp erstellen data-type in Ihrer Tabelle, was Ihr Problem extrem einfach machen würde.

Ich weiß also nicht, warum Sie den 'Day' gewählt haben Format für Ihre Abfrage, aber mit diesem <some date> wird zu to_char(sysdate, 'DAY') .

Aus Ihrem Kommentar unter <some date> wäre to_char(sysdate, 'DD-MON-YY')

<some time> wäre to_char(systimestamp,'HH24:MI:SS:FF3') , was Ihnen den Zeitstempel auf die Millisekunde genau geben würde, obwohl der Datentyp auf die Mikrosekunde gehen kann.

Es erscheint mir etwas seltsam, aber Ihre Abfrage würde dann lauten:

select <columns>
  from my_table
 where state_date <= to_char(sysdate, 'DD-MON-YY')
   and state_time <= to_char(systimestamp,'HH24:MI:SS:FF3')

Es wäre normaler, wenn ein Datum als String gespeichert wird, es im Format yyyymmdd zu speichern So können Sie zumindest garantieren, dass es in Ordnung ist. Wenn Sie so etwas getan haben, ändern Sie einfach die Formatmaske. Wenn Sie dies nicht getan haben, werden diese Abfragen nicht wie beabsichtigt funktionieren.

Persönlich, wenn Sie haben Daten auf diese Weise zu speichern und state_date anzunehmen wird beispielsweise als dd-mon-yy gespeichert , d. h. einschließlich Jahr, Monat UND Tag und state_time wie oben angegeben gespeichert wird, dann würde ich so etwas tun:

select <columns>
  from my_table
 where to_timestamp(state_date || state_time, 'DD-MON-YYHH24:MI:SS:FF3')
        <= systimestamp

Es macht es viel offensichtlicher, was vor sich geht, und es gibt keine Zweideutigkeit darüber, was < ist bedeutet in dieser Situation, dass ein Datum immer kleiner als ein zukünftiges Datum sein wird, was nicht unbedingt für Strings gilt.

Ich hoffe, das macht Sinn.