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:
Så
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