webentwicklung-frage-antwort-db.com.de

Oracle: Wie füge ich einem Zeitstempel Minuten hinzu?

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?

34
Sajee

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.

28
Dave Costa

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
110
Justin Cave

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
11
crazy
UPDATE "TABLE" 
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute 
WHERE (...)

Wo interval einer von ist 

  • JAHR
  • MONAT
  • TAG
  • STUNDE
  • MINUTE
  • ZWEITE
10
jtomaszk

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.

3

Können wir das nicht gebrauchen?

SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;

Ich bin neu in dieser Domain.

2
saidevakumar

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

1

Basierend auf dem, was Sie verlangen, möchten Sie das Format HH24: MI für to_char. 

1

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>
0
Sam

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;
0
Bilal