In diesem Beitrag versuche ich, viele Dinge über das Datum in Oracle zu erklären, wie z
Oracle hat Datums- und Zeitstempeltypen zum Speichern der Datums- und Zeitinformationen in der Oracle-Datenbank bereitgestellt.
Datumsdatentyp
DATE ist der Oracle-Datentyp, mit dem wir alle vertraut sind, wenn wir daran denken, Datums- und Zeitwerte darzustellen. Monat, Tag,
Jahr, Jahrhundert, Stunden, Minuten und Sekunden können gespeichert werden. Das Problem mit dem DATE-Datentyp ist seine Granularität, wenn versucht wird, ein Zeitintervall zwischen zwei Ereignissen zu bestimmen, wenn die Ereignisse innerhalb einer Sekunde nacheinander stattfinden. Dieses Problem wird mit dem TIMESTAMP-Datentyp
Zeitstempel
Oracle hat den DATE-Datentyp erweitert und uns den TIMESTAMP-Datentyp gegeben, der alle Informationen speichert, die der DATE-Datentyp speichert, aber auch Bruchteile von Sekunden enthält. Wenn Sie einen DATE-Datentyp in ein TIMESTAMP-Datentypformat konvertieren möchten, können Sie die CAST-Funktion
verwendenSQL> SELECT CAST(last_login_date AS TIMESTAMP) "Date" FROM users; Date ----------------------------------------------------- 20-APR-16 01.55.14.000000 PM 21-JUN-16 14.16.36.000000 AM 21-JUL-16 10.16.36.000000 AM 21-SEP-16 11.16.36.000000 AM 21-DEC-16 11.16.36.000000 AM
Um das Systemdatum und die Systemzeit in einem TIMESTAMP-Datentyp zurückzugeben, können Sie die SYSTIMESTAMP-Funktion verwenden, wie zum Beispiel:
SQL> SELECT SYSTIMESTAMP FROM DUAL; SYSTIMESTAMP --------------------------------------------------------------------------- 01-SEP-19 01.02.17.158913 PM -04:00
Ein wichtiger Punkt
1)Sowohl DATE- als auch TIMESTAMP-Typen enthalten immer eine Datums- und Zeitkomponente. Punkt Mitternacht ist es 00:00:00 Uhr.
SELECT TO_CHAR(SYSDATE, 'MM/DD/YYYY HH:MI:SS AM') date_with_time ,TRUNC(SYSDATE) today ,TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY HH:MI:SS AM') date_with_time_midnight FROM dual 2 3 4 ;DATE_WITH_TIME TODAY DATE_WITH_TIME_MIDNIGHT ---------------------- --------- ---------------------- 10/27/2016 11:01:00 AM 27-OCT-16 10/27/2016 12:00:00 AM
2) Verlassen Sie sich niemals auf implizite Konvertierungen von Zeichenketten in Datumsangaben oder Daten in Zeichenketten. Führen Sie die Konvertierungen immer explizit mit den Funktionen TO_CHAR, TO_DATE und TO_TIMESTAMP durch oder verwenden Sie ANSI-DATE- oder TIMESTAMP-Literale.
3) Berücksichtigen Sie beim Vergleichen von Datums- oder Zeitstempeln immer die Auswirkungen der Zeitkomponente. Wenn Sie die Zeitkomponente vom Vergleich abziehen möchten, verwenden Sie TRUNC oder RUND Funktionen, um es von beiden Seiten des Vergleichs zu entfernen.
select * from fnd_table where trunc(creation_date) < trunc(sysdate);
4) Sie können das erforderliche Datumsformat mit nls_date_format auf Sitzungsebene anzeigen
Datumsformat in Oracle mit nls_date_format ändern
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY MM DD'; select sysdate from dual; ALTER SESSION SET NLS_DATE_FORMAT = 'HH24:MI:SS'; select sysdate from dual; alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'; select sysdate from dual;
5) Hier ist eine gute Zusammenfassung der Zeitformate, die wir verwenden können
Element | Beschreibung |
Datumsformatelemente | |
SCC oder CC | Jahrhundert; S stellt dem BC-Datum – | voran
JJJJ oder SYJJJ | Jahr; S stellt dem BC-Datum – | voran
YYY oder YY oder Y | Letzte 3, 2 oder 1 Ziffer des Jahres |
J,JJJ | Jahr mit einem Komma an dieser Stelle |
IYYY, IYY, IY, I | 4-, 3-, 2- oder 1-stelliges Jahr basierend auf dem ISO-Standard |
JAHR oder JAHR | Jahr ausgeschrieben; S stellt dem BC-Datum – | voran
BC oder AD | BC/AD-Indikator |
B.C. oder A.D. | BC/AC-Indikator mit Punkten |
Q | Quartal des Jahres |
MM | Monat, zweistelliger Wert |
MONAT | Monatsname mit Leerzeichen auf 9 Zeichen aufgefüllt |
MON | Name des Monats, Abkürzung aus drei Buchstaben |
RM | Monat in römischer Zahl |
WW oder W | Woche des Jahres oder Monats |
DDD oder DD oder D | Jahres-, Monats- oder Wochentag |
TAG | Name des Tages mit Leerzeichen auf 9 Zeichen aufgefüllt |
DY | Name des Tages; 3-Buchstaben-Abkürzung |
J | Julianischer Tag; die Anzahl der Tage seit dem 31. Dezember 4713 v. Chr. |
Zeitformatelemente | |
AM oder PM | Meridiananzeige |
Vormittags oder PM | Meridiananzeige mit Perioden |
HH oder HH12 oder HH24 | Tagesstunde oder Stunde(1-12) oder Stunde(0-23) |
MI | Minute (0-59) |
SS | Sekunde (0-59) |
SSSSS | Sekunden nach Mitternacht (0-86399) |
Suffixe | |
TH | Ordnungszahl (d. h. DDTH für 5.) |
SP | Ausgeschriebene Nummer (d. h. DDSP für FÜNF) |
SPTH oder THSP | Ausgeschriebene Ordnungszahlen (z. B. DDSPTH für FIFTH) |
Andere Formatierungselemente | |
/ , . | Satzzeichen werden im Ergebnis wiedergegeben |
„der“ | Angegebener String wird im Ergebnis wiedergegeben |
Orakel-Datumsfunktionen
Wir haben im vorherigen Abschnitt etwas über die Datentypen Date und Timestamp gelernt. Wir werden nun wichtige Orakel-Datumsfunktionen im Detail sehen und wie wir sie verwenden können
ADD_MONTHS
Datumsfunktion | Beschreibung |
ADD_MONTHS (Datum, n) | Gibt einen Datumswert zurück, nachdem „n“ Monate zum Datum „x“ hinzugefügt wurden. |
select ADD_MONTHS ('16-Sep-81', 3) from dual ---------------------------- 16-Dec-81
ADD_MONTHS verschiebt das Datum immer um ganze Monate. Sie können für den Parameter month_shift einen Bruchwert angeben, aber ADD_MONTHS rundet immer auf die ganze Zahl ab, die der nächsten Null am nächsten kommt, wie in diesen
Beispielen gezeigt:
Also
select ADD_MONTHS ('28-FEB-2005', 1.5) from dual ------------------------------------------- 31-Mar-2005
Wir können auch negative Werte verwenden
select ADD_MONTHS ('28-FEB-2005', -1) from dual ------------------------------ 31-Jan-2005
Letzter_Tag
Datumsfunktion | Beschreibung |
LETZTER_TAG (x) | Es wird verwendet, um die Anzahl der verbleibenden Tage in einem Monat ab dem angegebenen Datum „x“ zu bestimmen. |
Die LAST_DAY-Funktion gibt das Datum des letzten Tages des Monats für ein bestimmtes Datum zurück. Diese Funktion ist nützlich, da die Anzahl der Tage in einem Monat im Laufe des Jahres variiert.
select LAST_DAY ('01-Jun-16') from dual ---------------------------------------------------- 30-Jun-2016
Nächster_Tag
Datumsfunktion | Beschreibung |
NÄCHSTER_TAG (x, Wochentag) | Gibt das nächste Datum des „Wochentags“ am oder nach dem Datum „x“ zurück. |
NÄCHSTER_TAG liefert das Datum des ersten nach Tag benannten Wochentags, der nach dem Datum liegt. Der Rückgabetyp ist immer DATE, unabhängig vom Datentyp von date. Das Argument Tag muss ein Wochentag in der Datumssprache Ihrer Sitzung sein, entweder der vollständige Name oder die Abkürzung
select NEXT_DAY ('01-Jun-08', 'Wednesday') from dual ------------------------------------------- 04-JUN-08
MONTHS_BETWEEN
Datumsfunktion | Beschreibung |
MONTHS_BETWEEN (x1, x2) | Gibt die Anzahl der Monate zwischen den Daten x1 und x2 zurück. |
Die Funktion MONTHS_BETWEEN berechnet die Anzahl der Monate zwischen zwei Daten und gibt diese Differenz als Zahl zurück
Regeln für die Berechnung sind
1) Wenn Datum1 nach Datum2 kommt, gibt MONTHS_BETWEEN eine positive Zahl zurück.
2) Wenn Datum1 vor Datum2 kommt, gibt MONTHS_BETWEEN eine negative Zahl zurück.
3) Wenn Datum1 und Datum2 beide auf den letzten Tag fallen ihrer jeweiligen Monate, dann gibt MONTHS_BETWEEN eine ganze Zahl zurück (kein Bruchteil).
4)Wenn date1 und date2 in unterschiedlichen Monaten liegen und mindestens eines der Datumsangaben nicht der letzte Tag des Monats ist, gibt MONTHS_BETWEEN a zurück Bruchzahl. Die Teilkomponente wird auf einer 31-Tage-Basis berechnet und berücksichtigt auch alle Unterschiede in der Zeitkomponente von Datum1 und Datum2.
Beispiele
select MONTHS_BETWEEN ('29-FEB-2016', '31-MAR-20') from dual -------------------------------------------------------------------------------- -1 select MONTHS_BETWEEN ('31-MAR-1995', '28-FEB-1994') from dual ------------------------------------------------------------------------------- 13 select MONTHS_BETWEEN ('31-JAN-2006', '10-MAR-2006') from dual ---------------------------------------------------------------------------- -1.3225806 SELECT MONTHS_BETWEEN (TO_DATE('02-02-1995','MM-DD-YYYY'), TO_DATE('01-01-1995','MM-DD-YYYY') ) "Months" FROM DUAL; Months ---------- 1.03225806
Ein wichtiger Punkt, den Sie sich merken sollten
MONTHS_BETWEEN berechnet den Bruchteil der Anzahl der Monate unter der Annahme, dass
jeder Monat 31 Tage hat. Daher zählt jeder zusätzliche Tag über einen ganzen Monat als 1/31 eines Monats und:
1 geteilt durch 31 =0,032258065
Runde
Datumsfunktion | Beschreibung |
ROUND (x, Datumsformat) | Gibt das Datum „x“ zurück, gerundet auf das nächste Jahrhundert, Jahr, Monat, Datum, Stunde, Minute oder Sekunde, wie durch „date_format“ angegeben. |
Die ROUND-Funktion rundet einen Datumswert auf das nächste Datum, wie durch eine Formatmaske angegeben. Es ist genau wie die standardmäßige numerische ROUND-Funktion, die eine Zahl auf die nächste Zahl mit angegebener Genauigkeit rundet, außer dass sie mit Datumsangaben arbeitet
Beispiele
Select ROUND (TO_DATE ('12-MAR-2016'), 'MONTH') from dual; 01-MAR-2016 Select ROUND (TO_DATE ('17-MAR-2016'), 'MONTH') from dual; 01-APR-2016 select ROUND (TO_DATE ('01-MAR-2007'), 'YYYY') from dual; 01-JAN-2007 select ROUND (TO_DATE ('01-SEP-2007'), 'YEAR') from dual; 01-JAN-2008
Trunc
Datumsfunktion | Beschreibung |
TRUNC (x, Datumsformat) | Gibt das Datum „x“ zurück, das kleiner oder gleich dem nächsten Jahrhundert, Jahr, Monat, Datum, Stunde, Minute oder Sekunde ist, wie durch „date_format“ angegeben. |
Beispiele
Select TRUNC (TO_DATE ('12-MAR-2016'), 'MONTH') from dual; 01-MAR-2016 Select TRUNC (TO_DATE ('17-MAR-2016'), 'MONTH') from dual; 01-MAR-2016 select TRUNC (TO_DATE ('01-MAR-2007'), 'YYYY') from dual; 01-JAN-2007 select TRUNC (TO_DATE ('01-SEP-2007'), 'YEAR') from dual; 01-JAN-2007
Arithmetik mit Oracle-Datum
Wir können viele arithmetische Operationen mit dem Orakel-Datumsdatentyp durchführen. Wir können eine Zahl zu oder von einem Datum für einen resultierenden Datumswert addieren oder subtrahieren. Wir können zwei Daten subtrahieren, um die Anzahl der Tage zwischen diesen Daten zu ermitteln. Wir addieren die bisherigen Stunden, indem wir die Anzahl der Stunden durch 24 dividieren.
Beispiele für Addition und Subtraktion
SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual; SYSDATE SYSDATE+1/24 SYSDATE+1/1440 SYSDATE+1/86400 -------------------- -------------------- -------------------- -------------------- 01-Jul-2016 06:32:12 01-Jul-2016 07:32:12 01-Jul-2016 06:33:12 01-Jul-2016 06:32:13
Andere Möglichkeiten, wie wir es verwenden können, sind
Beschreibung | Datumsausdruck |
Jetzt | Sysdate |
Morgen/nächster Tag | Sysdate +1 |
Vor sieben Tagen | SYSDATE -7 |
In einer Stunde | SYSDATE + 24.1. |
In drei Stunden | SYSDATE + 24.03 oder SYSDATE + 08.01 |
In einer halben Stunde | SYSDATE + 1/48 |
In 10 Minuten | SYSDATE + 10/1440 |
In 30 Sekunden | SYSDATE + 30/86400 |
Arithmetische Operation für die Datumsdifferenz, um die Anzahl der Tage zwischen ihnen zu ermitteln
Wir können zwei Daten subtrahieren, um den Tagesunterschied zwischen den Daten zu ermitteln
If the time part is same, then it will always whole number SELECT TO_DATE('25-MAR-2016 11:00:00 AM', 'DD-MON-YYYY HH:MI:SS AM') - TO_DATE('19-MAR-2016 11:00:00 AM', 'DD-MON-YYYY HH:MI:SS AM') diff_in_days FROM dual; DIFF_IN_DAYS ---------- 6 If the time part is not same, then it will always be having fractional components SELECT TO_DATE('25-MAR-2016 10:00:00 AM', 'YYYYMMDD HH:MI:SS AM') - TO_DATE('19-MAR-2016 11:00:00 AM', 'YYYYMMDD HH:MI:SS AM') diff_in_days FROM dual; DIFF_IN_DAYS ---------- 5.95833333 SQL> SELECT TO_DATE('25-MAR-2016 11:00:00 AM', 'YYYYMMDD HH:MI:SS AM') - TO_DATE('19-MAR-2016 10:00:00 AM', 'YYYYMMDD HH:MI:SS AM') diff_in_days FROM dual; DIFF_IN_DAYS ---------- 6.04166666
Mit der Abfrage können wir den Orakel-Datumsunterschied in Monaten finden
SELECT MONTHS_BETWEEN (TO_DATE('02-02-1995','MM-DD-YYYY'), TO_DATE('01-01-1995','MM-DD-YYYY') ) "Diff_in_Months", (TO_DATE('02-02-1995','MM-DD-YYYY')- TO_DATE('01-01-1995','MM-DD-YYYY') diff_in_days FROM DUAL;Diff_in_Months diff_in_days ---------------------------------------- 1.03225806 32
Mit der Abfrage können wir auch den Orakel-Datumsunterschied in Jahren finden
SELECT (TO_DATE('20130525', 'YYYYMMDD') - TO_DATE('20100101', 'YYYYMMDD')) diff_in_days , MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD')) Diff_in_months ,TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))) Diff_in_months_no_fraction, TRUNC(TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))) / 12) Diff_in_years_no_fraction ,MOD(TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))), 12) Diff_in_years_fraction_in_months FROM dual; DIFF_IN_DAYS DIFF_IN_MONTHS DIFF_IN_MONTHS_NO_FRACTION DIFF_IN_YEAR_NO_FRACTION DIFF_IN_YEARS_FRACTION_IN_MONTHS ____________________________________________________________________________________ 1240 40.7741 40 3 4
Ich hoffe, Ihnen gefällt der Beitrag zum Oracle-Datumsdatentyp. Ich habe versucht, verschiedene Dinge zu erklären, wie Oracle-Datumsfunktionen, Oracle-SQL-Datumsformat, Oracle-SQL-Datumsvergleich, Oracle-Datumsunterschied in Jahren, Oracle-Datumsunterschied in Tagen, Oracle-Datumsunterschied in Monaten. Es ist kein vollständiger Leitfaden, aber ich habe versucht, viele nützliche Informationen für den Oracle-SQL-Entwickler zu präsentieren
Verwandte Artikel
Wie man SQL-Abfragen schreibt
Oracle SQL-Tutorial:Grundlegende SQL-Anweisung
Oracle SQL-Tutorial:Den Datensatz einschränken
Einzelzeilenfunktionen in SQL
Oracle-Sql-Dekodierungsverarbeitung
Herunterladen Oracle SQL-Entwickler
https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780