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
gebruikenSQL> 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 vindenIf 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