Ich muss den Werten in einer Oracle-Datumsspalte 30 Minuten hinzufügen. Ich mache dies in meiner SELECT-Anweisung durch Angabe
to_char(date_and_time + (.000694 * 31)
was die meiste Zeit gut funktioniert. Aber nicht, wenn die Zeit an der AM/PM-Grenze ist. Wenn Sie beispielsweise 30 Minuten zu 12:30
[PM] hinzufügen, wird der 1:00
AM zurückgegeben. Die Antwort, die ich erwarte, ist 13:00
. Was ist der richtige Weg, um dies zu tun?
Alle anderen Antworten sind grundsätzlich richtig, aber ich glaube nicht, dass jemand Ihre ursprüngliche Frage direkt beantwortet hat.
Angenommen, "date_and_time" ist in Ihrem Beispiel eine Spalte vom Typ DATE oder TIMESTAMP. Ich denke, Sie müssen dies nur ändern:
to_char(date_and_time + (.000694 * 31))
zu diesem:
to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI')
Es scheint, als würde Ihr Standard-Datumsformat den Stundencode "HH" verwenden, nicht "HH24".
Ich denke auch, dass Ihre ständige Amtszeit sowohl verwirrend als auch ungenau ist. Ich schätze, Sie haben berechnet, dass (.000694) ungefähr eine Minute ist, und Sie multiplizieren es mit der Anzahl der Minuten, die Sie hinzufügen möchten (31 im Beispiel, obwohl Sie im Text 30 angegeben haben).
Ich würde auch mit einem Tag beginnen und ihn in die gewünschten Einheiten innerhalb Ihres Codes aufteilen. In diesem Fall wäre (1/48) 30 Minuten; oder wenn Sie es aus Gründen der Übersichtlichkeit auflösen möchten, können Sie schreiben ((1/24) * (1/2)).
Dies würde Rundungsfehler vermeiden (mit Ausnahme derjenigen, die dem Fließkomma-Wert innewohnen, die hier bedeutungslos sein sollten) und zumindest für mich klarer ist.
Neben der Möglichkeit, einem Datum eine Anzahl von Tagen hinzuzufügen, können Sie Intervalldatentypen verwenden, vorausgesetzt, Sie befinden sich in Oracle 9i
oder höher. Dies kann etwas einfacher zu lesen sein.
SQL> ed
Wrote file afiedt.buf
SELECT sysdate, sysdate + interval '30' minute FROM dual
SQL> /
SYSDATE SYSDATE+INTERVAL'30'
-------------------- --------------------
02-NOV-2008 16:21:40 02-NOV-2008 16:51:40
from http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value
Die SYSDATE-Pseudospalte zeigt das aktuelle Datum und die Uhrzeit des Systems an. Durch Hinzufügen von 1 zu SYSDATE wird das Datum um einen Tag vorgezogen. Fügen Sie dem Datum Stunden, Minuten oder Sekunden hinzu
SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual;
SYSDATE SYSDATE+1/24 SYSDATE+1/1440 SYSDATE+1/86400
-------------------- -------------------- -------------------- --------------------
03-Jul-2002 08:32:12 03-Jul-2002 09:32:12 03-Jul-2002 08:33:12 03-Jul-2002 08:32:13
UPDATE "TABLE"
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute
WHERE (...)
Wo interval
einer von ist
Ich bevorzuge die Verwendung eines interval
-Literal, da interval '30' minute
oder interval '5' second
viel einfacher zu lesen sind als 30 / (24 * 60)
oder 5 / (24 * 60 * 69)
.
z.B.
some_date + interval '2' hour
some_date + interval '30' minute
some_date + interval '5' second
some_date + interval '2' day
Sie können auch mehrere Einheiten in einem Ausdruck kombinieren:
some_date + interval '2 3:06' day to minute
Fügt dem Datumswert 2 Tage, 3 Stunden und 6 Minuten hinzu
Das obige ist ebenfalls Standard-SQL und funktioniert auch in mehreren anderen DBMS.
Weitere Informationen im Handbuch: https://docs.Oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00221
Wenn der Datentyp des Felds Datum oder Zeitstempel ist, sollte Oracle immer das richtige Ergebnis angeben, wenn Sie die richtige Anzahl in Tagen (oder in Ihrem Fall den richtigen Bruchteil eines Tages) angeben. Wenn Sie also versuchen, den Wert innerhalb von 30 Minuten zu erhöhen, sollten Sie Folgendes verwenden:
select field + 0.5/24 from table;
Aufgrund der von Ihnen bereitgestellten Informationen glaube ich, dass Sie dies versucht haben, und ich bin mir ziemlich sicher, dass es funktioniert.
Können wir das nicht gebrauchen?
SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;
Ich bin neu in dieser Domain.
Stellen Sie sicher, dass Oracle versteht, dass die Startzeit PM ist, und geben Sie die HH24-Formatmaske für die endgültige Ausgabe an.
SELECT to_char((to_date('12:40 PM', 'HH:MI AM') + (1/24/60) * 30), 'HH24:MI') as time
FROM dual
TIME
---------
13:10
Hinweis: Der 'AM'
im HH: MI ist nur der Platzhalter für den AM/PM-Meridianindikator. Könnte auch 'PM'
sein
Basierend auf dem, was Sie verlangen, möchten Sie das Format HH24: MI für to_char.
Um das Datum in Oracle zu bearbeiten, können Sie es versuchen
select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>
so sehr leicht
ich fügte dem Systemdatum 10 Minuten hinzu und benutze immer bevorzugt die Db-Server-Funktionen, keine benutzerdefinierten.
select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;