sql >> Databasteknik >  >> RDS >> Oracle

Hur man arbetar med datumfunktioner i Oracle sql

Det här inlägget försöker jag förklara många saker  om datum i Oracle som Oracle SQL-datumfunktioner, Oracle SQL-datumformat, Oracle SQL-datumjämförelse, Oracle-datumskillnad i år, Oracle-datumskillnad i dagar, Oracle-datumskillnad i månader

Oracle har tillhandahållit datum- och tidsstämpeltyper för lagring av datum- och tidsinformation i Oracle-databasen.

Datumtyp

DATE är orakeldatatypen som vi alla är bekanta med när vi tänker på att representera datum- och tidsvärden. Den har förmågan att lagra månad, dag,
år, århundrade, timmar, minuter och sekunder. Problemet med datatypen DATE är dess granularitet när man försöker bestämma ett tidsintervall mellan två händelser när händelserna inträffar inom en sekund från varandra. Det här problemet är löst med datatypen TIMESTAMP

Tidsstämpel

Oracle har utökat datatypen DATE och har gett oss datatypen TIMESTAMP som lagrar all information som datatypen DATE lagrar, men även inkluderar bråkdelar av sekunder. Om du vill konvertera en DATE-datatyp till ett TIMESTAMP-datatypformat kan du använda CAST-funktionen

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

För att få systemdatum och tid tillbaka i en TIMESTAMP-datatyp kan du använda funktionen SYSTIMESTAMP som:

SQL> SELECT SYSTIMESTAMP FROM DUAL;

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

En viktig punkt

1)Både DATE- och TIMESTAMP-typerna innehåller alltid en datum- och tidskomponent. Vid exakt midnatt är klockan 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) Lita aldrig på implicita konverteringar av strängar till datum eller datum till strängar. Utför alltid omvandlingarna uttryckligen med funktionerna TO_CHAR, TO_DATE och TO_TIMESTAMP, eller använd ANSI DATE- eller TIMESTAMP-literaler.
3) När du gör jämförelser med datum eller tidsstämpel, överväg alltid inverkan av tidskomponenten. Om du vill minska tidskomponenten från jämförelsen, använd TRUNC eller ROUND funktioner för att ta bort det från båda sidor av jämförelsen.

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

4) Du kan visa önskat datumformat med nls_date_format på sessionsnivå

Ändra datumformat i Oracle med 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) Här är en bra sammanfattning av de tidsformat vi kan använda

Element Beskrivning
Datumformatelement
SCC eller CC Sekel; S prefix f.Kr. datum med –
ÅÅÅÅ eller ÅÅÅÅ År; S prefix f.Kr. datum med –
ÅÅÅ eller ÅÅ eller Å Sista 3, 2 eller 1 siffra i året
Å,ÅÅÅ Årtal med kommatecken i denna position
IYYY, IYY, IY, I 4, 3, 2 eller 1 siffrigt årtal baserat på ISO-standarden
SYEAR eller YEAR Årtal preciserat; S prefix f.Kr. datum med –
BC eller AD BC/AD-indikator
B.C. eller A.D. BC/AC-indikator med punkter
F Årets kvartal
MM Månad, tvåsiffrigt värde
MÅNAD Månadens namn fyllt med blanktecken till en längd på 9 tecken
MÅN Månadens namn, trebokstavsförkortning
RM månad i romerska siffror
WW eller W Veckan i året eller månaden
DDD eller DD eller D Dag på året, månaden eller veckan
DAG Dagens namn fyllt med blanktecken till en längd på 9 tecken
DY Dagens namn; 3 bokstäver förkortning
J Julians dag; antalet dagar sedan 31 december 4713 f.Kr.
Tidsformatselement
AM eller PM Meridianindikator
A.M. eller P.M. Meridianindikator med punkter
HH eller HH12 eller HH24 Timme på dagen eller timme(1-12) eller timme(0-23)
MI Minut (0-59)
SS Andra (0-59)
SSSSS Sekunder efter midnatt (0-86399)
Suffix
TH Ordinalnummer (dvs. DDTH för 5TH)
SP Utstavat nummer (dvs. DDSP för FEM)
SPTH eller THSP Utstavade ordningstal (dvs. DDSPTH för FIFTH)
Andra formateringselement
/ , . Interpunktion återges i resultatet
”av” Citerad sträng återges i resultatet

oracle datumfunktioner

Vi lärde oss om datatyp för datum och tidsstämpel i föregående avsnitt. Vi kommer nu att se viktiga oracle-datumfunktioner i detalj och hur vi kan använda dem

ADD_MONTHS  

Datumfunktion Beskrivning
ADD_MONTHS (datum, n) Returnerar ett datumvärde efter att ha lagt till "n" månader till datumet "x".
select ADD_MONTHS ('16-Sep-81', 3)      from dual
----------------------------
16-Dec-81

ADD_MONTHS flyttar alltid datumet med hela månader. Du kan ange ett bråktal för parametern month_shift, men ADD_MONTHS avrundar alltid nedåt till hela talet närmast noll, som visas i dessa
exempel:

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

Vi kan också använda negativa värden

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

Sista_dagen

Datumfunktion Beskrivning
LAST_DAY (x) Den används för att bestämma antalet dagar som återstår i en månad från det angivna datumet 'x'.

Funktionen LAST_DAY returnerar datumet för den sista dagen i månaden för ett givet datum. Den här funktionen är användbar eftersom antalet dagar i en månad varierar under året.

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

Nästa_dag

Datumfunktion Beskrivning
NEXT_DAY (x, week_day) Returnerar nästa datum för "veckodag" på eller efter datumet "x" inträffar.

NEXT_DAY returnerar datumet för den första veckodagen namngiven efter dag som är senare än datumet. Returtypen är alltid DATUM, oavsett datatyp för datum. Argumentationsdagen måste vara en veckodag på datumspråket för din session, antingen det fullständiga namnet eller förkortningen

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

MONTHS_BETWEEN 

Datumfunktion Beskrivning
MONTHS_BETWEEN (x1, x2) Returnerar antalet månader mellan datum x1 och x2.

Funktionen MONTHS_BETWEEN beräknar antalet månader mellan två datum och returnerar skillnaden som ett tal

Regler för beräkningen är

1)Om datum1 kommer efter datum2, returnerar MONTHS_BETWEEN ett positivt tal.
2) Om datum1 kommer före datum2, returnerar MONTHS_BETWEEN ett negativt tal.
3) Om datum1 och datum2 båda faller på den sista dagen av sina respektive månader returnerar MONTHS_BETWEEN ett heltal (ingen bråkdel).
4)Om datum1 och datum2 är i olika månader och minst ett av datumen inte är den sista dagen i månaden, returnerar MONTHS_BETWEEN en bråktal. Bråkkomponenten beräknas på 31-dagarsbasis och tar även hänsyn till eventuella skillnader i tidskomponenten datum1 och datum2.

Exempel

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

En viktig punkt att komma ihåg

MONTHS_BETWEEN beräknar bråkdelen av antalet månader genom att anta att
varje månad har 31 dagar. Därför räknas varje ytterligare dag under en hel månad för 1/31 av en månad, och:
1 dividerat med 31 =.032258065

Runda 

Datumfunktion Beskrivning
ROUND (x, datumformat) Returnerar datumet "x" avrundat till närmaste århundrade, år, månad, datum, timme, minut eller sekund enligt "date_format".

Funktionen ROUND avrundar ett datumvärde till närmaste datum som anges av en formatmask. Det är precis som den vanliga numeriska ROUND-funktionen, som avrundar ett tal till närmaste antal med specificerad precision, förutom att den fungerar med datum

Exempel

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

Datumfunktion Beskrivning
TRUNC (x, datumformat) Returnerar datumet 'x' som är mindre än eller lika med närmaste århundrade, år, månad, datum, timme, minut eller sekund som specificerats av 'date_format'.

Exempel

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

Aritmetik med Oracle-datum

Vi kan utföra många aritmetiska operationer på oracle datum datatypen. Vi kan addera eller subtrahera ett tal till eller från ett datum för ett resulterande datumvärde. vi kan subtrahera två datum för att hitta antalet dagar mellan dessa datum. vi lägger till timmar till datum genom att dividera antalet timmar med 24.

Exempel på addition och 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

Andra sätt vi kan använda det är

Beskrivning Datumuttryck
Nu Sysdate
Imorgon/ nästa dag Sysdate +1
Sju dagar sedan SYSDATE -7
En timme från nu SYSDATE + 1/24
Om tre timmar SYSDATE + 3/24  eller SYSDATE + 1/8
En halvtimme från nu SYSDATE + 1/48
10 minuter från nu SYSDATE + 10/1440
30 sekunder från och med nu SYSDATE + 30/86400

Aritmetisk operation på  datumskillnad för att hitta antalet dagar mellan dem

Vi kan subtrahera två datum för att hitta  dagarnas skillnad mellan datumen

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

Vi kan hitta orakeldatumskillnaden i månader med hjälp av frågan

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

Vi kan också hitta orakeldatumskillnaden i år med hjälp av frågan

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


Hoppas du gillar inlägget om oracle date datatype. Jag  har försökt förklara olika saker som oracle-datumfunktioner, oracle sql-datumformat, oracle sql-datumjämförelse, oracle-datumskillnad i år, oracle-datumskillnad i dagar, oracle-datumskillnad i månader. Det är inte en komplett guide men jag har försökt presentera mycket användbar information för Oracle SQL-utvecklaren

Relaterade artiklar

hur man skriver sql-frågor
Oracle sql-handledning:Grundläggande SQL-sats
Oracle sql-handledning:Begränsning av datamängden
Enradsfunktioner i sql
Oracle sql-avkodningsbearbetning
Ladda ner Oracle SQL-utvecklare
https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780


  1. Få kortdagsnamnet i SQL Server (T-SQL)

  2. Vilket är det bästa PostgreSQL-gränssnittet? Jämförelse 2021

  3. postgresql lista och beställ tabeller efter storlek

  4. Entity Framework 6 med Npgsql