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