sql >> Database >  >> RDS >> Oracle

Hoe te werken met datumfuncties in Oracle sql

In dit bericht probeer ik veel dingen uit te leggen over datum in Oracle, zoals Oracle SQL-datumfuncties, Oracle SQL-datumnotatie, Oracle SQL-datumvergelijking, Oracle-datumverschil in jaren, Oracle-datumverschil in dagen, Oracle-datumverschil in maanden

Oracle heeft datum- en tijdstempeltypes geleverd voor het opslaan van de datum- en tijdinformatie in de Oracle-database.

Datum gegevenstype

DATE is het orakel-gegevenstype dat we allemaal kennen als we nadenken over het weergeven van datum- en tijdwaarden. Het heeft de mogelijkheid om de maand, dag,
jaar, eeuw, uren, minuten en seconden op te slaan. Het probleem met het datatype DATE is de granulariteit ervan bij het bepalen van een tijdsinterval tussen twee gebeurtenissen wanneer de gebeurtenissen binnen een seconde van elkaar plaatsvinden. Dit probleem is opgelost met het datatype TIMESTAMP

Tijdstempel

Oracle heeft het datatype DATE uitgebreid en ons het datatype TIMESTAMP gegeven dat alle informatie opslaat die het datatype DATE opslaat, maar ook fractionele seconden bevat. Als u een DATE-gegevenstype naar een TIMESTAMP-gegevenstypeformaat wilt converteren, kunt u de CAST-functie

gebruiken
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

Om de systeemdatum en -tijd terug te krijgen in een TIMESTAMP-gegevenstype, kunt u de SYSTIMESTAMP-functie gebruiken, zoals:

SQL> SELECT SYSTIMESTAMP FROM DUAL;

SYSTIMESTAMP
---------------------------------------------------------------------------
01-SEP-19 01.02.17.158913 PM -04:00

Een belangrijk punt

1) Zowel het DATE- als het TIMESTAMP-type bevatten altijd een datum- en tijdcomponent. Om precies middernacht is het 00:00:00.

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) Vertrouw nooit op impliciete conversies van strings naar datums, of datums naar strings. Voer de conversies altijd expliciet uit met de functies TO_CHAR, TO_DATE en TO_TIMESTAMP, of gebruik ANSI DATE- of TIMESTAMP-letterwoorden.
3) Houd bij het vergelijken van datums of tijdstempels altijd rekening met de impact van de tijdcomponent. Als u de tijdcomponent van de vergelijking wilt verdisconteren, gebruikt u de TRUNC of ROND functies om het van beide kanten van de vergelijking te verwijderen.

select * from fnd_table where trunc(creation_date) < trunc(sysdate);

4) U kunt het vereiste datumformaat weergeven met nls_date_format op sessieniveau

Wijzig de datumnotatie in oracle met nls_date_format

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 is een goede samenvatting van de tijdformaten die we kunnen gebruiken

Element Beschrijving
Datumnotatie-elementen
SCC of CC Eeuw; S voorvoegsels BC datum met –
YYYY of SYYYY Jaar; S voorvoegsels BC datum met –
YYY of YY of Y Laatste 3, 2 of 1 cijfer van het jaar
J,JJJ Jaar met een komma op deze positie
IYYY, IYY, IY, ik 4, 3, 2 of 1  cijferig jaar op basis van de ISO-norm
SYEAR of JAAR Jaar gespeld; S voorvoegsels BC datum met –
BC of AD BC/AD-indicator
B.C. of AD BC/AC-indicator met punten
Q Kwartaal van het jaar
MM Maand, tweecijferige waarde
MAAND Naam van maand opgevuld met spaties tot een lengte van 9 tekens
MA Naam van de maand, afkorting van drie letters
RM Romeinse cijfers maand
WW of W Week van het jaar of de maand
DDD of DD of D Dag van het jaar, maand of week
DAG Naam van de dag opgevuld met spaties tot een lengte van 9 tekens
DY Naam van de dag; 3 letters afkorting
J Juliaanse dag; het aantal dagen sinds 31 december 4713 v.Chr.
Tijdnotatie-elementen
AM of PM Meridiaanindicator
AM of PM Meridiaanindicator met punten
HH of HH12 of HH24 Uur van de dag of uur (1-12) of uur (0-23)
MI Minuut (0-59)
SS Tweede (0-59)
SSSS Seconden na middernacht (0-86399)
Suffixen
TH Rangnummer (d.w.z. DDTH voor 5TH)
SP Gespeld nummer (d.w.z. DDSP voor VIJF)
SPTH of THSP Gespelde rangtelwoorden (d.w.z. DDSPTH voor VIJFDE)
Andere opmaakelementen
/ , . Interpunctie wordt weergegeven in het resultaat
“van de” Aangehaalde tekenreeks wordt weergegeven in het resultaat

orakel datumfuncties

We hebben in de vorige sectie geleerd over het gegevenstype Datum en Tijdstempel. We zullen nu belangrijke orakeldatumfuncties in detail zien en hoe we ze kunnen gebruiken

ADD_MONTHS  

Datumfunctie Beschrijving
ADD_MONTHS (datum, n) Retourneert een datumwaarde na toevoeging van 'n' maanden aan de datum 'x'.
select ADD_MONTHS ('16-Sep-81', 3)      from dual
----------------------------
16-Dec-81

ADD_MONTHS verschuift de datum altijd met hele maanden. U kunt een fractionele waarde opgeven voor de parameter month_shift, maar ADD_MONTHS wordt altijd naar beneden afgerond op het hele getal dat het dichtst bij nul ligt, zoals weergegeven in deze
voorbeelden:

Dus

select ADD_MONTHS ('28-FEB-2005', 1.5)              from dual
-------------------------------------------
31-Mar-2005

We kunnen ook negatieve waarden gebruiken

select ADD_MONTHS ('28-FEB-2005', -1)                from dual
------------------------------
31-Jan-2005

Laatste_dag

Datumfunctie Beschrijving
LAST_DAY (x) Het wordt gebruikt om het aantal resterende dagen in een maand te bepalen vanaf de opgegeven datum 'x'.

De functie LAST_DAY retourneert de datum van de laatste dag van de maand voor een bepaalde datum. Deze functie is handig omdat het aantal dagen in een maand het hele jaar door varieert.

select LAST_DAY ('01-Jun-16')     from dual
----------------------------------------------------
30-Jun-2016

Volgende_dag

Datumfunctie Beschrijving
NEXT_DAY (x, week_day) Retourneert de volgende datum van de 'week_day' op of na de datum waarop 'x' plaatsvindt.

NEXT_DAY retourneert de datum van de eerste weekdag genoemd naar dag die later is dan de datum. Het retourtype is altijd DATE, ongeacht het datatype van de datum. De argumentdag moet een dag van de week zijn in de datumtaal van uw sessie, ofwel de volledige naam of de afkorting

select NEXT_DAY ('01-Jun-08', 'Wednesday')       from dual
-------------------------------------------
04-JUN-08

MONTHS_BETWEEN 

Datumfunctie Beschrijving
MONTHS_BETWEEN (x1, x2) Retourneert het aantal maanden tussen datums x1 en x2.

De functie MONTHS_BETWEEN berekent het aantal maanden tussen twee datums en retourneert dat verschil als een getal

Regels voor de berekening zijn

1)Als datum1 na datum2 komt, dan geeft MONTHS_BETWEEN een positief getal terug.
2) Als datum1 vóór datum2 komt, geeft MONTHS_BETWEEN een negatief getal terug.
3) Als datum1 en datum2 beide op de laatste dag vallen van hun respectievelijke maanden, dan retourneert MONTHS_BETWEEN een geheel getal (geen fractionele component).
4)Als datum1 en datum2 in verschillende maanden liggen en ten minste één van de datums niet de laatste dag van de maand is, retourneert MONTHS_BETWEEN een fractioneel getal. De fractionele component wordt berekend op basis van 31 dagen en houdt ook rekening met eventuele verschillen in de tijdcomponent van date1 en date2.

Voorbeelden

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

Een belangrijk punt om te onthouden

MONTHS_BETWEEN berekent de fractionele component van het aantal maanden door aan te nemen dat
elke maand 31 dagen heeft. Daarom telt elke extra dag gedurende een volledige maand voor 1/31 van een maand, en:
1 gedeeld door 31 =.032258065

Ronde 

Datumfunctie Beschrijving
RONDE (x, date_format) Retourneert de datum 'x' afgerond op de dichtstbijzijnde eeuw, jaar, maand, datum, uur, minuut of seconde zoals gespecificeerd door de 'date_format'.

De functie ROUND rondt een datumwaarde af op de dichtstbijzijnde datum zoals gespecificeerd door een formaatmasker. Het is net als de standaard numerieke ROUND-functie, die een getal rondt op het dichtstbijzijnde aantal gespecificeerde precisie, behalve dat het werkt met datums

Voorbeelden

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

Datumfunctie Beschrijving
TRUNC (x, date_format) Retourneert de datum 'x' kleiner dan of gelijk aan de dichtstbijzijnde eeuw, jaar, maand, datum, uur, minuut of seconde zoals gespecificeerd door de 'date_format'.

Voorbeelden

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

Rekenen met Oracle-datum

We kunnen veel rekenkundige bewerkingen uitvoeren op het datatype orakeldatum. We kunnen een getal toevoegen aan of aftrekken van een datum voor een resulterende datumwaarde. we kunnen twee datums aftrekken om het aantal dagen tussen die datums te vinden. we Voeg uren toe tot nu toe door het aantal uren te delen door 24.

Voorbeelden van optellen en aftrekken

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 manieren waarop we het kunnen gebruiken zijn

Beschrijving Datumuitdrukking
Nu Sysdate
Morgen/volgende dag Sysdate +1
Zeven dagen  geleden SYSDATE -7
Over een uur SYSDATUM + 1/24
Over drie uur SYSDATE + 24/3  of SYSDATE + 1/8
Over een half uur SYSDATE + 1/48
Over 10 minuten SYSDATE + 10/1440
30 seconden vanaf nu SYSDATE + 30/86400

Rekenkundige bewerking op  datumverschil om het aantal dagen ertussen te vinden

We kunnen twee datums aftrekken om  het verschil in dagen tussen  de datums

. te vinden
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

We kunnen het orakeldatumverschil in  Maanden vinden met behulp van de zoekopdracht

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

We kunnen ook het orakeldatumverschil in  jaren vinden met behulp van de zoekopdracht

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


Ik hoop dat je het bericht op Oracle date datatype leuk vindt. Ik heb geprobeerd verschillende dingen uit te leggen, zoals Oracle-datumfuncties, Oracle SQL-datumnotatie, Oracle SQL-datumvergelijking, Oracle-datumverschil in jaren, Oracle-datumverschil in dagen, Oracle-datumverschil in maanden. Het is geen complete gids, maar ik heb geprobeerd veel nuttige informatie te geven voor de Oracle SQL-ontwikkelaar

Gerelateerde artikelen

SQL-query's schrijven
Oracle sql-zelfstudie :Basic Sql-instructie
Oracle sql-zelfstudie:De gegevensset beperken
Functies met één rij in sql
Oracle sql-decoderingsverwerking
Download Oracle SQL-ontwikkelaar
https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780


  1. Hoe current_timestamp() werkt in PostgreSQL

  2. ROLLBACK-gebeurtenistriggers in postgresql

  3. Geef meerdere waarden door in één parameter

  4. Wat is in SQL / MySQL het verschil tussen ON en WHERE in een join-instructie?