sql >> Databáze >  >> RDS >> Oracle

Jak pracovat s datovými funkcemi v Oracle sql

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:00 

Ně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 AM

2) 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- 81

ADD_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 2005

Můžeme použít i záporné hodnoty

vyberte ADD_MONTHS ('28-FEB-2005', -1)                z duální-------------------------------31 - leden 2005

Poslední_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 2016

Next_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-08

MONTHS_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,03225806

Dů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,032258065

Kulatá 

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-2008

Trunc

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-2007

Aritmetika 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:13

Další 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.04166666

Pomocí 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              32

Pomocí 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 SQL

Souvisejí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


  1. Vyhněte se pojmenování uživatelských uložených procedur SP% nebo SP_%

  2. Monitorování změn tabulky v Oracle

  3. Získejte horní 1 řádek každé skupiny

  4. Rozdělte časové období na jeden řádek za měsíc na serveru SQL