Frage

Ich brauche 30 Minuten auf Werte in einer Oracle-Datum Spalte hinzuzufügen. Ich tue dies in meiner SELECT-Anweisung mit der Angabe

to_char(date_and_time + (.000694 * 31)

, die arbeitet die meiste Zeit in Ordnung. Aber nicht, wenn die Zeit auf der AM / PM-Grenze. Zum Beispiel das Hinzufügen 30 Minuten bis 12:30 [die PM] gibt 1:00 die Uhr ist. Die Antwort, die ich erwarte, ist 13:00. Was ist der richtige Weg, dies zu tun?

War es hilfreich?

Lösung

Alle anderen Antworten sind grundsätzlich richtig, aber ich glaube nicht, dass jemand die direkt Ihre ursprüngliche Frage beantwortet.

Unter der Annahme, dass „date_and_time“ in Ihrem Beispiel eine Spalte mit Typ Datum oder Zeitstempel ist, glaube ich Sie genau dies ändern müssen:

to_char(date_and_time + (.000694 * 31))

folgt aus:

to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI')

Es klingt wie Ihr Standard-Datumsformat den „HH“ Code für die Stunde nutzt, nicht „HH24“.

Auch ich denke, Ihr ständiger Begriff sowohl verwirrend und ungenau ist. Ich denke, was Sie getan haben, ist, dass berechnen (0,000694) ist über den Wert von einer Minute, und Sie vermehren sich durch die Anzahl der Minuten, die Sie hinzufügen möchten (31 im Beispiel, obwohl Sie die 30 im Text).

Ich würde auch mit einem Tag beginnen und es in die Einheiten unterteilen Sie in Ihrem Code mögen. In diesem Fall (1/48) würde 30 Minuten; oder, wenn Sie es brechen für Klarheit wollen, könnten Sie schreiben ((1/24) * (1/2)).

Dies würde Rundungsfehler vermeiden (mit Ausnahme der inhärenten Fließkomma der hier sinnlos sein soll) und ist klarer, zumindest für mich.

Andere Tipps

Zusätzlich zu der Möglichkeit, eine Anzahl von Tagen zu einem Datum hinzuzufügen, können Sie Intervall-Datentypen verwenden, vorausgesetzt, Sie auf Oracle 9i sind oder später, die etwas einfacher sein kann, zu lesen,

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

http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value

Die SYSDATE Pseudo-Spalte zeigt das aktuelle Systemdatum und -zeit. Hinzufügen von 1 bis SYSDATE wird das Datum um 1 Tag voraus. Verwenden Fraktionen hinzufügen Stunden, Minuten oder Sekunden auf das Datum

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 eines von

  • YEAR
  • Monat
  • Tag
  • Stunde
  • MINUTE
  • SECOND

Ich ziehe eine interval wörtlichen dafür verwenden, weil interval '30' minute oder interval '5' second viel einfacher zu lesen ist dann 30 / (24 * 60) oder 5 / (24 * 60 * 69)

z.

  • 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 2 Tage, 3 Stunden und 6 Minuten mit dem Datumswert

Die oben ist auch Standard-SQL und arbeitet auch in mehreren anderen DBMS.

Weitere Angaben im Handbuch: https://docs.oracle. com / database / 121 / SQLRF / sql_elements003.htm # SQLRF00221

Wenn der Datentyp des Feldes Datum oder Zeitstempel ist, Oracle sollte immer das richtige Ergebnis geben, wenn Sie die richtige Nummer angegeben in Anzahl der Tage (oder den richtigen Bruchteil eines Tages in Ihrem Fall) hinzuzufügen. Also, wenn Sie versuchen, den Wert in 30 Minuten zu stoßen, sollten Sie verwenden:

select field + 0.5/24 from table;

Auf der Grundlage der Informationen, die Sie zur Verfügung gestellt, ich glaube, das ist das, was Sie zu tun versucht, und ich bin ziemlich sicher, dass es funktioniert.

Können wir das nicht verwenden

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

Ich bin neu in diesem Bereich.

Seien Sie sicher, dass Oracle versteht, dass die Startzeit PM ist, und die HH24 Formatmaske für die endgültige Ausgabe angeben.

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: die 'AM' im HH: MI ist nur der Platzhalter für den AM / PM-Meridian-Indikatoren. Könnte auch 'PM' werden

Nach dem, was Sie für Fragen, möchten Sie die HH24: MI-Format für to_char.

Um Datum im Orakel zu bearbeiten können Sie versuchen,

  select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
           'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>

so sehr leicht

i hinzugefügt 10 Minuten, um Systemdatum und immer bevorzugt verwenden, um die Db-Server-Funktionen nicht benutzerdefinierte ein.

select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;
SELECT to_char(sysdate + (1/24/60) * 30, 'dd/mm/yy HH24:MI am') from dual;

einfach können Sie dies mit verschiedenem Datumsformat verwenden ....

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top