Oracle
 sql >> Database >  >> RDS >> Oracle

Come lavorare con le funzioni di data in Oracle sql

In questo post sto cercando di spiegare molte cose sulla data in Oracle come le funzioni della data di Oracle sql, il formato della data di Oracle SQL, il confronto della data di Oracle SQL, la differenza di data di Oracle in anni, la differenza di data di Oracle in giorni, la differenza di data di Oracle in mesi

Oracle ha fornito tipi di data e timestamp per la memorizzazione delle informazioni su data e ora nel database di Oracle.

Tipo di dati data

DATE è il tipo di dati Oracle con cui tutti abbiamo familiarità quando pensiamo di rappresentare i valori di data e ora. Ha la capacità di memorizzare mese, giorno,
anno, secolo, ore, minuti e secondi. Il problema con il tipo di dati DATE è la sua granularità quando si tenta di determinare un intervallo di tempo tra due eventi quando gli eventi si verificano entro un secondo l'uno dall'altro. Questo problema è stato risolto con il tipo di dati TIMESTAMP

Data e ora

Oracle ha ampliato il tipo di dati DATE e ci ha fornito il tipo di dati TIMESTAMP che memorizza tutte le informazioni memorizzate dal tipo di dati DATE, ma include anche frazioni di secondi. Se desideri convertire un tipo di dati DATE in un formato di tipo di dati TIMESTAMP, puoi utilizzare la funzione CAST

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

Per ottenere la data e l'ora del sistema restituite in un tipo di dati TIMESTAMP, puoi utilizzare la funzione SYSTIMESTAMP come:

SQL> SELECT SYSTIMESTAMP FROM DUAL;

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

Alcuni punti importanti

1) Entrambi i tipi DATE e TIMESTAMP contengono sempre una componente data e ora. A mezzanotte esatta sono le 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) Non fare mai affidamento su conversioni implicite di stringhe in date o date in stringhe. Esegui sempre le conversioni in modo esplicito con le funzioni TO_CHAR, TO_DATE e TO_TIMESTAMP oppure utilizza i valori letterali ANSI DATE o TIMESTAMP.
3) Quando esegui confronti di data o timestamp, considera sempre l'impatto del componente ora. Se desideri escludere la componente temporale dal confronto, utilizza il TRUNC o ROTONDA funzioni per rimuoverlo da entrambi i lati del confronto.

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

4) Puoi visualizzare il formato della data richiesto utilizzando nls_date_format a livello di sessione

Cambia il formato della data in Oracle usando 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) Ecco un buon riassunto dei formati temporali che possiamo utilizzare

Elemento Descrizione
Elementi formato data
SCC o CC Secolo; S antepone la data BC con –
AAAA o AAAA Anno; S antepone la data BC con –
AAAA o YY o Y Ultime 3, 2 o 1 cifra dell'anno
Y,YYY Anno con una virgola in questa posizione
AAAA, AAA, AAA, io Anno a 4, 3, 2 o 1 cifra in base allo standard ISO
ANNO o ANNO Anno precisato; S antepone la data BC con –
BC o AD Indicatore BC/AD
a.C. o d.C. Indicatore BC/AC con periodi
D Trimestre dell'anno
MM Mese, valore a due cifre
MESE Nome del mese riempito con spazi vuoti fino a una lunghezza di 9 caratteri
LUN Nome del mese, abbreviazione di tre lettere
RM Mese in numeri romani
WW o W Settimana dell'anno o del mese
DDD o DD o D Giorno dell'anno, mese o settimana
GIORNO Nome del giorno riempito con spazi vuoti fino a una lunghezza di 9 caratteri
DY Nome del giorno; Abbreviazione di 3 lettere
J Giorno di Giuliano; il numero di giorni dal 31 dicembre 4713 aC
Elementi formato ora
AM o PM Indicatore del meridiano
AM o PM Indicatore del meridiano con punti
HH o HH12 o HH24 Ora del giorno o ora(1-12) o ora(0-23)
MI Minuti (0-59)
SS Secondo (0-59)
SSSSS Secondi dopo mezzanotte (0-86399)
Suffissi
ES Numero ordinale (es. DDTH per 5TH)
SP Numero scritto (es. DDSP per FIVE)
SPTH o THSP Numeri ordinali scritti (es. DDSPTH per QUINTO)
Altri elementi di formattazione
/ , . La punteggiatura viene riprodotta nel risultato
"del" La stringa tra virgolette viene riprodotta nel risultato

Funzioni di data di Oracle

Abbiamo appreso del tipo di dati Data e Timestamp nella sezione precedente. Vedremo ora in dettaglio importanti funzioni di data di oracolo e come possiamo usarle

AGGIUNGI_MESI  

Funzione data Descrizione
AGGIUNGI_MESI (data, n) Restituisce un valore di data dopo aver aggiunto "n" mesi alla data "x".
select ADD_MONTHS ('16-Sep-81', 3)      from dual
----------------------------
16-Dec-81

ADD_MONTHS sposta sempre la data di mesi interi. Puoi fornire un valore frazionario per il parametro month_shift, ma ADD_MONTHS verrà sempre arrotondato per difetto al numero intero più vicino allo zero, come mostrato in questi
esempi:

Quindi

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

Possiamo usare anche valori negativi

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

Ultimo_giorno

Funzione data Descrizione
ULTIMO GIORNO (x) Viene utilizzato per determinare il numero di giorni rimanenti in un mese dalla data 'x' specificata.

La funzione LAST_DAY restituisce la data dell'ultimo giorno del mese per una determinata data. Questa funzione è utile perché il numero di giorni in un mese varia durante l'anno.

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

Il giorno successivo

Funzione data Descrizione
NEXT_DAY (x, giorno_della_settimana) Restituisce la data successiva del "giorno_della settimana" uguale o successiva alla data "x".

NEXT_DAY restituisce la data del primo giorno della settimana denominato dal giorno successivo alla data. Il tipo restituito è sempre DATE, indipendentemente dal tipo di dati di date. Il giorno dell'argomento deve essere un giorno della settimana nella lingua della data della sessione, nome completo o abbreviazione

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

MESI_TRA 

Funzione data Descrizione
MESI_TRA (x1, x2) Restituisce il numero di mesi tra le date x1 e x2.

La funzione MONTHS_BETWEEN calcola il numero di mesi tra due date e restituisce la differenza come un numero

Le regole per il calcolo sono

1) Se la data1 viene dopo la data2, MONTHS_BETWEEN restituisce un numero positivo.
2) Se la data1 precede la data2, allora MONTHS_BETWEEN restituisce un numero negativo.
3) Se la data1 e la data2 cadono entrambe nell'ultimo giorno dei rispettivi mesi, MONTHS_BETWEEN restituisce un numero intero (nessuna componente frazionaria).
4)Se la data1 e la data2 sono in mesi diversi e almeno una delle date non è l'ultimo giorno del mese, MONTHS_BETWEEN restituisce un numero frazionario. La componente frazionaria è calcolata su una base di 31 giorni e considera anche le eventuali differenze nella componente temporale di data1 e data2.

Esempi

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

Un punto importante da ricordare

MONTHS_BETWEEN calcola la componente frazionaria del numero di mesi assumendo che
ogni mese abbia 31 giorni. Pertanto, ogni giorno aggiuntivo nell'intero mese conta per 1/31 di un mese e:
1 diviso per 31 =.032258065

Rotondo 

Funzione data Descrizione
ROUND (x, formato_data) Restituisce la data 'x' arrotondata al secolo, anno, mese, data, ora, minuto o secondo più vicino come specificato da 'date_format'.

La funzione ROUND arrotonda un valore di data alla data più vicina come specificato da una maschera di formato. È proprio come la funzione numerica ROUND standard, che arrotonda un numero al numero più vicino con la precisione specificata, tranne per il fatto che funziona con le date

Esempi

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

Tronco

Funzione data Descrizione
TRUNC (x, formato_data) Restituisce la data 'x' minore o uguale al secolo, anno, mese, data, ora, minuto o secondo più vicino come specificato da 'date_format'.

Esempi

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

Aritmetica con data Oracle

Possiamo eseguire molte operazioni aritmetiche sul tipo di dati della data dell'oracolo. Possiamo aggiungere o sottrarre un numero ao da una data per un valore di data risultante. possiamo sottrarre due date per trovare il numero di giorni tra quelle date. Aggiungiamo le ore fino ad oggi dividendo il numero di ore per 24.

Esempi di addizione e sottrazione

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

Altri modi in cui possiamo usarlo sono

Descrizione Espressione della data
Ora Sistema
Domani/ il prossimo giorno Sistema +1
Sette giorni  fa SYSDATE -7
Tra un'ora SYSDATE + 24/1
Tra tre ore SYSDATE + 24/3  o SYSDATE + 1/8
Tra mezz'ora SYSDATE + 1/48
Fra 10 minuti SYSDATE + 10/1440
Tra 30 secondi SYSDATE + 30/86400

Operazione aritmetica su  differenza di date per trovare il numero di giorni tra di loro

Possiamo sottrarre due date per trovare  la differenza di giorni tra  le date

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

Possiamo trovare la differenza di data di Oracle in  mesi utilizzando la query

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

Possiamo anche trovare la differenza di data di Oracle in  anni utilizzando la query

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


Spero che il post sul tipo di dati della data di Oracle ti piaccia. Ho cercato di spiegare varie cose come funzioni di data di Oracle, formato della data di Oracle sql, confronto di date di Oracle SQL, differenza di data di Oracle in anni, differenza di data di Oracle in giorni, differenza di data di Oracle in mesi. Non è una guida completa ma ho cercato di presentare molte informazioni utili per lo sviluppatore Oracle sql

Articoli correlati

come scrivere query sql
Tutorial Oracle sql:istruzione SQL di base
Tutorial Oracle sql:limitazione del set di dati
Funzioni a riga singola in sql
Elaborazione della decodifica Oracle sql
Download Sviluppatore Oracle SQL
https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780