Tento příspěvek se snažím vysvětlit mnoho věcí o datu v oracle, jako jsou funkce data Oracle SQL, formát data Oracle SQL, porovnání data Oracle SQL, rozdíl data Oracle v rokech, rozdíl data Oracle ve dnech, rozdíl data Oracle v měsících
Společnost Oracle poskytla typy datových a časových razítek pro ukládání informací o datu a čase v databázi Oracle.
Datový typ dat
DATE je datový typ věštce, který všichni známe, když přemýšlíme o reprezentaci hodnot data a času. Má schopnost uložit měsíc, den,
rok, století, hodiny, minuty a sekundy. Problémem s datovým typem DATE je jeho granularita při pokusu o určení časového intervalu mezi dvěma událostmi, kdy se události odehrávají během jedné sekundy od sebe. Tento problém je vyřešen pomocí datového typu TIMESTAMP
Časové razítko
Oracle rozšířil datový typ DATE a dal nám datový typ TIMESTAMP, který ukládá všechny informace, které ukládá datový typ DATE, ale také obsahuje zlomky sekund. Pokud chcete převést datový typ DATE na formát datového typu TIMESTAMP, můžete použít funkci CAST
SQL> SELECT CAST(last_login_date AS TIMESTAMP) "Datum" FROM uživatelů;Datum------------------------------- ----------------------20-DUB-16 01.55.14.000000 PM21-JUN-16 14.16.36.000000 AM21-ČERVEN-16 10.16.36.00-000 AM- 16 11.16.36.000000 AM 21-DEC-16 11.16.36.000000 AM
Chcete-li získat systémové datum a čas vrácené v datovém typu TIMESTAMP, můžete použít funkci SYSTIMESTAMP, například:
SQL> VYBERTE SYSTIMESTAMP Z DUAL;SYSTIMESTAMP--------------------------------------- ------------------------------------01-SEP-19 01.02.17.158913 PM -04:00Nějaký důležitý bod
1)Oba typy DATE a TIMESTAMP vždy obsahují složku data a času. Přesně o půlnoci je čas 00:00:00.
SELECT TO_CHAR(SYSDATE, 'MM/DD/YYYY HH:MI:SS AM') date_with_time,TRUNC(SYSDATE) dnes,TO_CHAR(TRUNC(SYSDATE), 'MM/DD/RRRR HH:MI:SS AM' ) date_with_time_midnightFROM 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 00:00:00 AM2) Nikdy se nespoléhejte na implicitní převody řetězců na data nebo data na řetězce. Vždy explicitně provádějte převody pomocí funkcí TO_CHAR, TO_DATE a TO_TIMESTAMP nebo použijte literály ANSI DATE nebo TIMESTAMP.
3) Při porovnávání data nebo časového razítka vždy zvažte dopad časové složky. Pokud chcete z porovnání slevit časovou složku, použijte TRUNC nebo KOLA funkce k odstranění z obou stran srovnání.vyberte * z fnd_table kde trunc(datum_vytvoření)4) Požadovaný formát data můžete zobrazit pomocí nls_date_format na úrovni relace
Změňte formát data v oracle pomocí nls_date_format
ALTER SESSION SET NLS_DATE_FORMAT ='RRRR MM DD';vyberte sysdate z duálního;ALTER SESSION SET NLS_DATE_FORMAT ='HH24:MI:SS';vyberte sysdate z duálního;změňte sadu relace nls_date_format ='dd-mon-yyyy hh24 mi:ss';vyberte sysdate z dual;5) Zde je dobrý přehled formátů času, které můžeme použít
Prvek Popis Prvky formátu data SCC nebo CC Století; S předpony BC datum s – YYYY nebo SYYYY Rok; S předpony BC datum s – YYY nebo YY nebo Y Poslední 3, 2 nebo 1 číslice roku Y,YYY Rok s čárkou na této pozici IYYY, IYY, IY, I 4, 3, 2 nebo 1 číslice roku podle normy ISO ROK nebo ROK Rok je uveden; S předpony BC datum s – BC nebo AD Indikátor BC/AD B.C. nebo A.D. Indikátor BC/AC s tečkami O Čtvrtletí MM Měsíc, dvoumístná hodnota MĚSÍC Název měsíce doplněný mezerami o délce 9 znaků PO Název měsíce, třípísmenná zkratka RM Měsíc s římskými číslicemi WW nebo W Týden roku nebo měsíc DDD nebo DD nebo D Den v roce, měsíc nebo týden DEN Název dne doplněný mezerami o délce 9 znaků DY Název dne; 3písmenná zkratka J Juliánský den; počet dní od 31. prosince 4713 př.nl Prvky formátu času AM nebo PM Ukazatel poledníku A.M. nebo P.M. Ukazatel poledníku s tečkami HH nebo HH12 nebo HH24 Hodina dne nebo hodina (1–12) nebo hodina (0–23) MI minuta (0–59) SS Druhá (0–59) SSSSS Sekundy po půlnoci (0-86399) Přípony TH Pořadové číslo (tj. DDTH pro 5. den) SP Vypsané číslo (tj. DDSP pro PĚT) SPTH nebo THSP Vyhláskovaná pořadová čísla (tj. DDSPTH pro FIFTH) Další prvky formátování / , . Interpunkce je reprodukována ve výsledku „z“ Ve výsledku je reprodukován řetězec v uvozovkách funkce data Oracle
O datovém typu Date a Timestamp jsme se dozvěděli v předchozí části. Nyní podrobně uvidíme důležité funkce data Oracle a jak je můžeme použít
ADD_MONTHS
Funkce data Popis ADD_MONTHS (datum, n) Vrátí hodnotu data po přidání „n“ měsíců k datu „x“. vyberte ADD_MONTHS ('16-Sep-81', 3) z duálního-----------------------------16-Dec- 81ADD_MONTHS vždy posune datum o celé měsíce. Pro parametr month_shift můžete zadat zlomkovou hodnotu, ale ADD_MONTHS se vždy zaokrouhlí dolů na celé číslo nejbližší nule, jak je znázorněno v těchto
příkladech:Takže
vyberte ADD_MONTHS ('28-FEB-2005', 1.5) z duální-------------------------------- -----------31. března 2005Můžeme použít i záporné hodnoty
vyberte ADD_MONTHS ('28-FEB-2005', -1) z duální-------------------------------31 - leden 2005Poslední_den
Funkce data Popis POSLEDNÍ_DEN (x) Používá se k určení počtu dní zbývajících v měsíci od data zadaného „x“. Funkce LAST_DAY vrací datum posledního dne v měsíci pro dané datum. Tato funkce je užitečná, protože počet dní v měsíci se v průběhu roku mění.
vyberte LAST_DAY ('01-Jun-16') z dual---------------------------------- ------------------30. června 2016Next_day
Funkce data Popis NEXT_DAY (x, week_day) Vrátí další datum „week_day“ po datu „x“ nebo později. NEXT_DAY vrátí datum prvního dne v týdnu pojmenovaného dnem, který je pozdější než datum. Návratový typ je vždy DATE, bez ohledu na datový typ data. Den argumentu musí být den v týdnu v jazyce data vaší relace, buď celé jméno, nebo zkratka
vyberte NEXT_DAY ('01-Jun-08', 'Centnesday') z duálního------------------------------ -------------04-JUN-08MONTHS_BETWEEN
Funkce data Popis MONTHS_BETWEEN (x1, x2) Vrátí počet měsíců mezi daty x1 a x2. Funkce MONTHS_BETWEEN vypočítá počet měsíců mezi dvěma daty a vrátí tento rozdíl jako číslo
Pravidla pro výpočet jsou
1)Pokud datum1 následuje po datu2, vrátí MONTHS_BETWEEN kladné číslo.
2) Pokud datum1 předchází date2, vrátí MONTHS_BETWEEN záporné číslo.
3) Pokud datum1 i datum2 připadnou na poslední den příslušných měsíců, pak MONTHS_BETWEEN vrátí celé číslo (bez zlomkové složky).
4)Pokud datum1 a datum2 jsou v různých měsících a alespoň jedno z dat není posledním dnem v měsíci, vrátí MONTHS_BETWEEN zlomkové číslo. Zlomková složka se vypočítává na 31denní bázi a také zohledňuje případné rozdíly v časové složce date1 a date2.Příklady
vyberte MONTHS_BETWEEN ('29-FEB-2016', '31-Mar-20') z duálního--------------------------- -------------------------------------------------- -----1vyberte MONTHS_BETWEEN ('31-MAR-1995', '28-FEB-1994') z duálního------------------------- -------------------------------------------------- -----13vyberte MONTHS_BETWEEN ('31-JAN-2006', '10-Mar-2006') z duálního------------------------- -------------------------------------------------- ---1,3225806SELECT MONTHS_BETWEEN(TO_DATE('02-02-1995','MM-DD-YYYY'),TO_DATE('01-01-1995','MM-DD-YYYY') ) "Měsíce" OD DUAL;Měsíce----------1,03225806Důležitý bod k zapamatování
MONTHS_BETWEEN vypočítá zlomkovou složku počtu měsíců za předpokladu, že
každý měsíc má 31 dní. Každý další den za celý měsíc se tedy počítá jako 1/31 měsíce a:
1 děleno 31 =0,032258065Kulatá
Funkce data Popis KOLA (x, datum_formát) Vrátí datum „x“ zaokrouhlené na nejbližší století, rok, měsíc, datum, hodinu, minutu nebo sekundu, jak je uvedeno ve formátu „date_format“. Funkce ROUND zaokrouhlí hodnotu data na nejbližší datum určené maskou formátu. Je to stejné jako standardní numerická funkce ROUND, která zaokrouhluje číslo na nejbližší číslo zadané přesnosti, kromě toho, že pracuje s daty
Příklady
Vyberte ROUND (TO_DATE ('12-MAR-2016'), 'MONTH') z dual;01-Mar-2016Vyberte ROUND (TO_DATE ('17- MAR-2016'), 'MONTH') z dual;01 -DUBEN-2016vyberte ROUND (TO_DATE ('01-MAR-2007'), 'YYYY') z duálního;01-JAN-2007vyberte ROUND (TO_DATE ('01-SEP-2007'), 'YEAR') z duálního;01 -LED-2008Trunc
Funkce data Popis TRUNC (x, datum_formát) Vrátí datum ‚x‘ menší nebo rovné nejbližšímu století, roku, měsíci, datu, hodině, minutě nebo sekundě, jak je uvedeno ve formátu ‚date_format‘. Příklady
Vyberte TRUNC (TO_DATE ('12-MAR-2016'), 'MONTH') z dual;01-Mar-2016 Vyberte TRUNC (TO_DATE ('17- MAR-2016'), 'MONTH') z dual; 01-MAR-2016 vyberte TRUNC (TO_DATE ('01-Mar-2007'), 'YYYY') z duálního;01-JAN-2007Aritmetika s datem Oracle
Můžeme provádět mnoho aritmetických operací s datovým typem oracle date. Můžeme přidat nebo odečíst číslo k datu nebo od data pro výslednou hodnotu data. můžeme odečíst dvě data, abychom zjistili počet dní mezi těmito daty. hodiny přidáme k datu vydělením počtu hodin číslem 24.
Příklady sčítání a odčítání
SQL> vyberte sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 z dual;SYSDATE SYSDATE+1/24 SYSDATE+1/1440 6-4-4-0-1. -------------- ------------------- ---------------- ---- --------------------01-červenec-2016 06:32:12 01-červenec-2016 07:32:12 01-červenec-2016 06 :33:12 1. července 2016 06:32:13Další způsoby, jak to můžeme použít, jsou
Popis Výraz data Nyní Sysdate Zítra / další den Sysdate +1 Před sedmi dny SYSDATE -7 Za hodinu SYSDATE + 1/24 Za tři hodiny SYSDATE + 3/24 nebo SYSDATE + 1/8 Za půl hodiny SYSDATE + 1/48 Za 10 minut SYSDATE + 10/1440 za 30 sekund SYSDATE + 30/86400 Aritmetická operace na rozdílu dat k nalezení počtu dnů mezi nimi
Můžeme odečíst dvě data, abychom našli rozdíl dní mezi daty
Pokud je časová část stejná, pak bude vždy celé čísloSELECT 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_daysFROM dual;DIFF_IN_DAYS----------6Pokud časová část není stejná, pak vždy bude mít zlomkové složky SELECT TO_DATE('25-Mar-2016 10:00:00 AM', 'RRRRMMDD HH:MI:SS AM')- TO_DATE('19-Mar-2016 11:00:00 AM', 'RRRRMMDD HH:MI:SS AM') diff_in_daysFROM dual;DIFF_IN_DAYS----------5.95833333SQL> SELECT TO_DATE('25. Března-2016 11:00:00 AM', MMDD 'RRRR:MIYY SS AM')- TO_DATE('19-Mar-2016 10:00:00 AM', 'RRRRMMDD HH:MI:SS AM') diff_in_daysFROM dual;DIFF_IN_DAYS----------6.04166666Pomocí dotazu můžeme najít rozdíl mezi datem oracle v měsících
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-RRRR')-TO_DATE('01-01-1995','MM-DD-RRRR') diff_in_daysFROM DUAL;Diff_in_Months diff_in_days------ -------------------------------1.03225806 32Pomocí dotazu můžeme také najít rozdíl mezi datem oracle v rokech
SELECT (TO_DATE('20130525', 'RRRRMMDD') – TO_DATE('20100101', 'RRRRMMDD')) diff_in_days , MONTHS_BETWEEN(TO_DATE('20130'525'), RRDD'MMDD'DATUM 11. RRRR'01.RRRR ')) Diff_in_months,TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'RRRRMMDD'), TO_DATE('20100101', 'RRRRMMDD')))) Diff_in_months_no_fraction (YYYYMMDD',3) (YYYYMMDD',3)(YYYYMMDD',3) (YYYYMMDD',3) (YYYYMMDD',3) (YYYYMMDD')) (YYYYMMDD')) (YYYYMMDD')) (YYYYMMDD')) (YYYYMMDD')) (YYYYMMDD')) (YYYYMMDD'),3Diff_in_months_no_fraction,YYYYYMMDD'20130525', '20130525', 'YYYYMMDD'0,TRUNC'52. , TO_DATE('20100101', 'RRRRMMDD'))) / 12) Diff_in_years_no_fraction,MOD(TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'RRRRMMDD'), TO_DATE (2.2.2010201) RRRR1 Diff_in_years_fraction_in_monthsFROM 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
Doufám, že se vám příspěvek o datovém typu Oracle bude líbit. Snažil jsem se vysvětlit různé věci, jako jsou funkce data Oracle, formát data Oracle SQL, porovnání data Oracle SQL, rozdíl data Oracle v letech, rozdíl data Oracle ve dnech, rozdíl data Oracle v měsících. Není to úplný průvodce, ale pokusil jsem se předložit mnoho užitečných informací pro vývojáře Oracle SQLSouvisející články
jak psát dotazy SQL
Výukový program SQL SQL :Základní příkaz SQL
Výukový program Oracle SQL :Omezení datové sady
Funkce jednoho řádku v SQL
Zpracování dekódování Oracle SQL
Stáhnout Vývojář Oracle SQL
https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780