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

So arbeiten Sie mit Datumsfunktionen in Oracle SQL

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

gelöst

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

verwenden
SQL> 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

voran voran voran
Element Beschreibung
Datumsformatelemente
SCC oder CC Jahrhundert; S stellt dem BC-Datum –
JJJJ oder SYJJJ Jahr; S stellt dem BC-Datum –
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 –
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