Come configurare smartphone e PC. Portale informativo
  • casa
  • OS
  • Funzioni di data Oracle. Una breve guida pratica per uno sviluppatore di sistemi informativi basati su oracle subd

Funzioni di data Oracle. Una breve guida pratica per uno sviluppatore di sistemi informativi basati su oracle subd

Come estrarre la data dal database in formato conveniente g.m.a. (giorno.mese.anno) Oracolo... La funzione to_char() ci aiuterà. Grazie a lei, puoi convertire l'ora nel formato desiderato. Dai un'occhiata a un esempio.

SELECT to_char (current_timestamp, "DD.MM.YYYY") come date_create da DUAL

Il formato dell'ora è GG.MM.AAAA (giorno.mese.anno). Puoi usare qualsiasi carattere come separatore: /,:, -.

Per visualizzare l'ora corrente nel formato giorno.mese.anno ore: minuti: secondi utilizzare i parametri GG.MM.AAAA HH24: MI: SS.

SELECT to_char (current_timestamp, "DD.MM.YYYY HH24: MI: SS") come date_create da DUAL / * output: 06.10.2017 16:50:52 * /

Diciamo che vuoi visualizzare l'inizio dell'anno? L'anno in corso ti verrà automaticamente sostituito. In questo esempio, ho usato la concatenazione ||. Di più informazioni dettagliate troverete a pagina TO_CHAR FUNZIONE. In quella pagina c'è grande lista parametri per convertire la data in stringa.

SELEZIONA "01.01." || to_char (current_timestamp, "YYYY") come date_create da DUAL

Visualizzazioni: 1762, Livello: Facile, Valutazione: 0, Data: 26-10-2016 14:07:32

Questa sezione illustra le funzioni di data/ora e le conversioni del tipo di data. Oracle fornisce un tipo speciale DATE per la memorizzazione di data e ora. CON punto fisico guardalo numero frazionario, parte intera che memorizza il numero di giorni da una data di base e il tempo frazionario. Questo ti permette di impegnarti su date operazioni aritmetiche- addizione e sottrazione.

Funzione SYSDATE

Questa è una delle funzioni più comunemente utilizzate, restituisce la data e l'ora correnti dall'orologio del server. Esempio:

SELEZIONA DATA SISTEMA
DA doppio

SYSDATA
26.12.2007 16:24:43

ADD_MONTHS (d, x) Funzione

Restituisce la data risultante dall'aggiunta di uno o più mesi alla data d. Il numero di mesi è specificato dai parametri x e x può essere negativo: in questo caso, il numero di mesi specificato viene sottratto dalla data specificata.

SELEZIONA SISTEMA d,
ADD_MONTHS (SYSDATE, 3) d1, ADD_MONTHS (SYSDATE, -3) d2
DA doppio

26.12.2007 16:24:43

26.03.2008 16:24:43

26.09.2007 16:24:43

LAST _DAY (d) funzione

Restituisce l'ultimo giorno del mese specificato in data d. Esempio:

SELEZIONA SISTEMA d,
LAST_DAY (SYSDATE) d1
DA doppio

26.12.2007 16:24:43

31.12.2008 16:24:43

Questa funzione è molto comoda per determinare il numero di giorni in un dato mese, ad esempio:

SELEZIONA SISTEMA d,
TO_CHAR (LAST_DAY (SYSDATE), "DD") d1
DA doppio

26.12.2007 16:24:43

MESI_BETWEEN Funzione (dl, d2)

La funzione MONTH_BETWEEN restituisce il numero di mesi tra due date dl e d2, dato il segno come dl-d2, il numero restituito è una frazione.

SELECT MONTHS_BETWEEN ("2.09.2006", "2.05.2006") d1,
M0NTHS_BETWEEN ("12.09.2006", "2.05.2006") d2,
M0NTHS_BETWEEN ("2.05.2006", "12.09.2006") d3
DA doppio

4,32258064516129

4,32258064516129

Funzione TRUN C (d [, maschera])

Tronca la data specificata in base alla maschera. Se non viene specificata alcuna maschera, viene eseguito il troncamento alla data (l'ora viene scartata).

SELEZIONA DATA SISTEMAd1,
TRONCO(SYSDATA) d2
DA doppio

26.09.2006 16:45:26

Diamo un'occhiata a esempi tipici: troncamento di una data in ore, giorni, mesi e anni. La maschera di formato predefinita è "DD"

SELEZIONA DATA SISTEMAdl,
TRONCO (SYSDATE, "HH24") d2,
TRONCO (SYSDATE, "DD") d3,
TRONCO (SYSDATE, "MM") d4,
TRONCO (SYSDATE, "AAAA") d5
DA doppio

26.09.2006 16:49:21

26.09.2006 16:00:00

26.09.2006 01.09.2006 01.01.2006

ROUND (d [, maschera]) funzione

ROUND è simile a TRUNC, ma invece di troncare, arrotonda. La maschera di formato predefinita è "DD". Esempio:

SELEZIONARESYSDATAD1,
ROUND (SYSDATO)d2,
TONDO (SYSDATO," NN24") d3,
IL GIRO(SYSDATA, " DD") d4,
TONDO (SYSDATO,"MM") d5
DA doppio

26.09.2006 16:50:50

27.09.2006 26.09.2006 17:00:00

27.09.2006 01.10.2006

Maschere di formato valide per le funzioni TRUNC e ROUND

Diamo un'occhiata più da vicino alle maschere di formato e alle caratteristiche del loro utilizzo:

Appuntamento

Primo giorno del secolo

ANNO, o AAAA,

Primo giorno dell'anno

o YY o Y

Primo giorno del trimestre

MESE, o LUN,

Primo giorno del mese

Lo stesso giorno della settimana dell'anno in corso

Lo stesso giorno della settimana del giorno del mese in corso

GIORNO o GIORNO o GIORNO

Primo giorno della settimana

NN, o NN12, o

Funzione TO_DATE (str [, mask [, nls_lang]])

La funzione TO_DATE converte la stringa str in una data. La trasformazione viene eseguita in base alla maschera maschera, se specificata. Se non viene specificata alcuna maschera, viene utilizzata la maschera predefinita. Se specifichi una maschera, puoi specificare un altro parametro: la lingua utilizzata durante la formattazione dei nomi di mesi e giorni. In caso di errore durante l'analisi della stringa str secondo quanto specificato

la maschera sorge situazione eccezionale... L'errore più comune è "ORA-01830: il modello di formato della data termina prima di convertire l'intera stringa di input". Inoltre, l'errore "ORA-01821: formato data non riconosciuto" non è raro: si verifica quando viene specificata una maschera di formato non valida. Esempio:

SELEZIONA T0_DATE ("09/12/2006") d
DA doppio

TO_CHAR (d [, maschera]) funzione

Converte la data d in una stringa di caratteri in base alla maschera specificata. Se si specifica una maschera non valida, viene sollevata l'eccezione "ORA-01821: formato data non riconosciuto". Esempio:

SELEZIONA SISTEMA d1,
TOLCHAR (SYSDATE, "GG.MM.AA HH24: MI") d2
DA doppio

Questo articolo è dedicato ai formati di data in Oracle e ad alcune specifiche della loro elaborazione. Questo articolo fornisce una panoramica di diverse maschere di formattazione della data standard, conversione esplicita e implicita di stringhe in date e Opzioni extra influenzare questo processo. Come nella prima parte dell'articolo, la discussione del materiale si basa su esempi che dimostrano capacità di formattazione non standard. I meccanismi Oracle coinvolti nel processo sono considerati in dettaglio. conversione implicita... La descrizione della maggior parte delle possibilità è accompagnata da collegamenti alle sezioni corrispondenti della documentazione.

Inizialmente, non avevo intenzione di scrivere un articolo sulle date, ma mi sarei soffermato sulla considerazione di un solo problema su questo argomento. Tuttavia, nel corso dei lavori, si è reso necessario illuminare vari ulteriori opportunità Oracle, cominciano ad apparire nuovi esempi. Quindi la considerazione di un problema è diventata un piccolo articolo. Spero che si sia rivelato non noioso, nonostante non sia l'argomento più interessante.

Si trova la prima parte dell'articolo, dedicata alle specifiche dell'ordine per operatore, all'operazione di not in e ad un esempio di conversione implicita di tipo.

Funzione To_date e formati data

Pochi programmatori amano gli argomenti di formattazione. Ad esempio, alcuni corsi si concentrano specificamente sulla formattazione della data e sugli argomenti locali su ultime ore l'ultimo giorno di allenamento, perché gli ascoltatori si annoiano. Il motivo del gran numero formati esistenti con il loro uso relativamente raro in compiti di routine... L'uso più comune delle maschere è in tre funzioni: to_number, to_char e to_date. In tutti e tre i casi, la maschera viene per seconda. parametro opzionale... E se il numero di maschere per la formattazione dei numeri è ancora più o meno sensato, allora ci sono oscenamente molte maschere per la formattazione delle date, più suffissi e modificatori.

Disponibilità, ovviamente un largo numero le maschere sono punto positivo, poiché amplia le possibilità, ad esempio, per verificare se il 13 settembre 2011 è un giorno del programmatore, è possibile utilizzare la maschera "DDD", che restituisce il numero del giorno nell'anno:
--Richiesta n. 1 select to_char (to_date ("09/13/2011"), "DDD") "Programmers day" da dual;
Nonostante gli ovvi vantaggi della formattazione, non avevo intenzione di includere nella seconda parte dell'articolo una panoramica dei formati di data ed esempi di utilizzo di maschere esotiche. In primo luogo, è improbabile che possa essere interessante per qualcuno e, in secondo luogo, anche l'autore non è un grande fan della formattazione complessa, poiché lo usa raramente nella vita reale. L'unico motivo per l'apparenza di questa sezione- alcune domande che i lettori hanno sull'utilizzo del formato RR.

Prima di passare direttamente all'argomento principale della sezione, diamo un'occhiata ad alcuni esempi non standard lavorare con le date.

Esempio 1. Utilizzo di modelli ridotti
Iniziamo con formattazione standard... Che la data odierna sia il 16/09/2011, le seguenti richieste verranno esaudite e cosa restituiranno?
--Request # 2 select to_char (sysdate, "YYYY") da dual; --Richiesta n. 3 select to_date ("03", "DD") da dual;
La query n. 2 è un tipico esempio di conversione di una data in una stringa e conversione in il formato desiderato... L'unica differenza è che invece delle più familiari maschere "DD.MM.YY" o "DD-MON-YYYY", abbiamo utilizzato una maschera che specifica solo l'anno. La richiesta n. 2 avrà esito positivo e restituirà l'anno in corso in formato a quattro cifre, ad es. "2011".

La query n. 3 è un po' più interessante, è un tipico esempio di conversione esplicita di una stringa in una data con una maschera di formato troncato, quindi, dal punto di vista della sintassi, la query è corretta e avrà esito positivo. La domanda più importante è il risultato della sua attuazione, ad es. in quale data tornerà se viene fornito solo il giorno? Prima di rispondere questa domanda Ricordiamo come Oracle imposta l'ora se non è impostata esplicitamente:
--Request # 4 select to_char (to_date ("03.02.2011", "DD.MM.YYYY"), "DD.MM.YYYY HH24: MI: SS") da dual; --Request # 5 select to_char (to_date ("03.02.2011 30", "DD.MM.YYYY MI"), "DD.MM.YYYY HH24: MI: SS") da dual;
La richiesta n. 4 non specifica l'ora, la richiesta n. 5 indica solo il numero di minuti, ore e secondi vengono omessi. In Oracle esiste una regola secondo la quale, se nella data non è presente una componente temporale, l'ora viene automaticamente impostata su 00:00:00 (ovvero mezzanotte), se viene specificata solo una parte degli elementi temporali (come in query n. 5), quindi gli elementi mancanti vengono impostati su 00. Pertanto, la query n. 4 restituirà la stringa "02/03/2011 00:00:00" e la query n. 5 - "02/03/2011 00:30 :00".

Torniamo alla domanda n. 3, è vero? questa regola per le date, ad es. Gli elementi della data mancanti vengono sostituiti con 00 o 01? Sì, vengono sostituiti, ma non tutti, più precisamente, per gli elementi di data mancanti, vengono utilizzati i valori di sysdate (il primo giorno del mese corrente dell'anno corrente). Pertanto, la query n. 3 utilizzerà 09 come mese e 2011 come anno, quindi il risultato dell'esecuzione della query sarà la data 03.09.2011.

Esempio n. 2. Ordine delle opzioni di formattazione
Verrà eseguita la query successiva e, in caso affermativo, in quale data verrà restituita?
--Richiesta n. 6 select to_date ("20092011", "YYYYDDMM") da dual;
A prima vista, l'assenza di delimitatori nella stringa della data può sembrare un fattore critico incompatibile con l'esecuzione della query, ma la maschera della data è anche specificata senza delimitatori e la stringa da convertire corrisponde allo schema specificato. Pertanto, la query n. 6 verrà eseguita correttamente e restituirà il 20/11/2009 (il formato del risultato potrebbe differire leggermente a seconda delle impostazioni della sessione). Considereremo più in dettaglio i problemi relativi ai separatori nel prossimo esempio.

Esempio n. 3. Conversione implicita

--Richiesta # 7 seleziona mesi_tra ("1 \ settembre-9", "01 $ ott / 08") da dual;
V questa richiesta ci sono due parametri stringa che devono essere convertiti in date utilizzando una conversione implicita. Secondo la documentazione, quando si utilizzano i formati predefiniti, la stringa da convertire implicitamente in una data deve seguire lo schema: separatore1 separatore2... La maggior parte dei caratteri separatori può essere utilizzata come separator1 e separator2 e personaggi speciali, inclusi spazi, tabulazioni e "e raddoppiato citazione singola"". Inoltre, se la stringa contiene almeno due cifre per specificare giorni, mesi e anni, il separatore può essere omesso del tutto. Ad esempio:
--Richiesta # 8 select to_date ("01September09") da dual; --Richiesta # 9 select to_date ("01sen09") da dual; - Query # 10 per questa query, il formato della data predefinito dovrebbe essere DD.MM.RR select to_date ("010909") da dual;
Poiché entrambe le stringhe specificate nella richiesta n. 7 corrispondono al modello specificato, la richiesta avrà esito positivo e restituirà il numero 11.

Esempio n. 4. Parametri della funzione To_date
Lascia che il formato della data predefinito sia DD.MON.RR e che la lingua della data sia il russo, funzionerà la seguente query:
--Request # 11 select to_date (sysdate, "mm/dd/yyyy hh24: mi: ss") da dual;
Una richiesta simile è apparsa in una delle discussioni sulla pagina Ask Tom. L'insidia della query è che stiamo cercando di convertire una data (sysdate) in una data. Se la richiesta fosse simile a questa:
--Request # 12 select to_char (sysdate, "mm / gg / aaaa hh24: mi: ss") da dual;
L'esecuzione sarebbe andata a buon fine e avrebbe restituito la stringa "09/15/2011 23:00:11". Tuttavia, la funzione to_date prevede una stringa come primo parametro, quindi la data viene convertita implicitamente prima in una stringa (che equivale a chiamare to_char (sysdate) con una maschera predefinita). Il risultato di questa conversione è la stringa "09/15/11", quindi viene chiamato to_date. Pertanto, la query n. 11 è equivalente alla seguente query:
--Request #13 select to_date ("09/15/11", "mm / gg / aaaa hh24: mi: ss") da dual;
Poiché non è difficile convincersene, la richiesta #13 non può essere eseguita, poiché la riga "15/09/11" non corrisponde alla maschera impostata, quindi nemmeno la richiesta #11 può essere eseguita.

Impostazione del formato della data predefinito
Il formato della data predefinito è impostato da due parametri: NLS_DATE_FORMAT (responsabile del formato stesso) e NLS_DATE_LANGUAGE (responsabile della lingua che verrà utilizzata durante la scrittura dei nomi di giorni, mesi, ecc.). Se questi parametri non sono specificati in modo esplicito, i loro valori vengono impostati in base al parametro NLS_LANG.

Esistono tre livelli in cui è possibile impostare il formato della data:

  1. Livello database: selezionare * da nls_database_parameters dove parametro in ("NLS_DATE_FORMAT", "NLS_DATE_LANGUAGE"); I parametri di questo livello sono impostati al momento della creazione del database e sono scritti nel file init.ora.
  2. Livello di istanza: selezionare * da nls_instance_parameters dove parametro in ("NLS_DATE_FORMAT", "NLS_DATE_LANGUAGE"); I parametri di questo livello vengono impostati all'inizio dell'istanza e possono essere modificati utilizzando il comando ALTER SYSTEM.
  3. Livello di sessione: selezionare * da nls_session_parameters dove parametro in ("NLS_DATE_FORMAT", "NLS_DATE_LANGUAGE"); I parametri di questo livello possono essere modificati con il comando ALTER SESSION. Inoltre, il valore di questi parametri può essere verificato utilizzando la query: select SYS_CONTEXT ("USERENV", "NLS_DATE_FORMAT"), SYS_CONTEXT ("USERENV", "NLS_DATE_LANGUAGE") da dual;
I parametri di ogni livello successivo "sovrascrivono" i parametri del precedente, ad es. se hai impostato i parametri del livello di sessione, i parametri dei livelli rimanenti non influenzeranno la tua sessione. Per impostare un unico formato di data per tutte le sessioni, Tom suggerisce di utilizzare il trigger ON-LOGON nella sua colonna: crea o sostituisci trigger data_logon_trigger dopo l'accesso ON DATABASE begin esegui immediatamente "alter session set nls_date_format =" "gg / mm / aaaa" "" ; fine;
Esempio n. 5. DD.MM.RR vs formato DD-MON-RR
Per prestare attenzione alla formattazione della data predefinita, mi è stata suggerita una certa stranezza nella conversione implicita delle stringhe in una data. consideriamo prossimo esempio:
--Request # 14 --Imposta il formato della data predefinito altera il set di sessione NLS_DATE_FORMAT = "DD.MM.RR"; --Imposta la data di default language alter session set NLS_DATE_LANGUAGE = "AMERICAN"; --Controlla il valore dei parametri di sessione select * from nls_session_parameters dove parametro in ("NLS_DATE_FORMAT", "NLS_DATE_LANGUAGE"); --Converti le stringhe in data select to_date ("09/11/11") da dual; seleziona to_date ("11.SEP.11") da dual;
È logico presumere che la conversione della stringa "11.09.11" alla data avrà successo, ma non la stringa "11.SEP.11". Tuttavia, questo non è il caso, entrambe le conversioni avranno successo. Inizialmente, ho pensato che se fosse impossibile convertire una stringa utilizzando una maschera di sessione, Oracle avrebbe provato a utilizzare maschere di altri livelli (la mia maschera a livello di database era impostata su "DD-MON-RR"). La lettura della documentazione ha mostrato che non è così e Oracle si ispira ai principi descritti nel paragrafo precedente.

Proviamo con un altro esempio:
--Request # 15 --Imposta il formato della data predefinito altera il set di sessione NLS_DATE_FORMAT = "DD.MON.RR"; --Imposta la data di default language alter session set NLS_DATE_LANGUAGE = "AMERICAN"; --Controlla il valore dei parametri di sessione select * from nls_session_parameters dove parametro in ("NLS_DATE_FORMAT", "NLS_DATE_LANGUAGE"); --Converti le stringhe in data select to_date ("09/11/11") da dual; seleziona to_date ("11.SEP.11") da dual;
Se pensi che il risultato sarà identico alla query precedente, ti sbagli. Una delle conversioni avrà esito negativo. V in questo caso la stringa "09/11/11" non corrisponde allo schema. Forse questo è misticismo?

Sfortunatamente no. La lettura della documentazione ha rivelato che esistono regole per gli elementi di formattazione della data con correzione automatica. Di seguito una tabella delle sostituzioni.

Elemento di formato originale Elementi di formato aggiuntivi da provare al posto dell'originale
"MM" "LUN" e "MESE"
"MON "MESE"
"MESE" "LUN"
"AA" "AAAA"
"RR" "RRRR"
Osservando il contenuto di questa tabella risulta evidente che il formato "GG.MM.RR" contiene implicitamente il formato "GG.MON.RR" (oltre a "GG.MESE.RR" e altri), ma nella "DD .MON.RR "formato" DD.MM.RR "non è presente, il che spiega il comportamento delle query # 14 e # 15.

Esempio n. 6. Formato RR vs YY
La maggior parte degli utenti è ben consapevole delle differenze tra le maschere RR e YY, ma c'è anche chi questa informazione sarà utile. Andiamo dritti all'esempio. Quali dati restituiranno le seguenti query:
--Richiesta # 16 select to_date ("11", "RR") "RR", to_date ("11", "YY") "YY" da dual; --Request # 17 select to_date ("99", "RR") "RR", to_date ("99", "YY") "YY" da dual;
Entrambe le query precedenti avranno esito positivo e restituiranno le date in base alle regole descritte nell'esempio n. 1 per la query n. 3. Pertanto, il valore del giorno in tutte le date ricevute sarà 01 e il valore del mese è 09 (se si esegue la query a settembre). Domanda principale, quale sarà il valore dell'anno?

Come è facile supporre, nella richiesta #16 sotto "11" intendevo 2011 ed entrambe le maschere me lo hanno restituito, ovvero il risultato dell'esecuzione della query # 16 è 09/01/2011 e 09/01/2011.

Nella query # 17, sotto "99" intendevo 1999, e qui le opinioni delle maschere sono state divise: la maschera RR ha restituito l'atteso 1999 e la maschera YY - 2099, ad es. il risultato della query n. 17 è 09/01/1999 e 09/01/2099.

Diamo un'occhiata più da vicino a come funzionano questi elementi di formattazione:
--Request # 18 select to_date ("00", "RR") "00", to_date ("49", "RR") "49", to_date ("50", "RR") "50", to_date ( "99", "RR") "99" dalla doppia unione seleziona tutto to_date ("00", "YY") "00", to_date ("49", "YY") "49", to_date ("50", "YY") "50", to_date ("99", "YY") "99" da doppio;
Come puoi vedere dalla query n. 18, le differenze nel lavoro delle maschere iniziano dagli anni '50, ad es. il formato YY restituisce sempre l'anno nel secolo corrente e RR l'anno<50 воспринимает как год текущего столетия, а год >50 - come un anno del secolo scorso. Infatti i valori to_date ("99", "RR") = 1999 e to_date ("00", "RR") = 2000 sono corretti solo se la data corrente è inferiore al 2051, seguito da to_date ("99 ", "RR" ) = 2099 e to_date ("00", "RR") = 2100. Se hai voglia di sperimentare, puoi cambiare l'ora del server in 2051 e vedere come cambierà il risultato della query # 18, basta non farlo su sistemi in esecuzione! Se l'orario del server cambia, sysdate cambierà ed è meglio non pensare nemmeno al mal di testa che avrai in tutti i rapporti, le tabelle di registro, ecc. Regole generali la conversione di un anno a due cifre in un anno a quattro cifre utilizzando il formato RR si presenta così:
Se l'anno a due cifre specificato è compreso tra 00 e 49, allora

  • Se le ultime due cifre dell'anno corrente sono comprese tra 00 e 49, l'anno restituito ha il stesse prime due cifre dell'anno in corso.
  • Se le ultime due cifre dell'anno in corso sono comprese tra 50 e 99, le prime 2 cifre dell'anno restituito sono maggiori di 1 rispetto alle prime 2 cifre dell'anno in corso.
Se l'anno a due cifre specificato è compreso tra 50 e 99, allora
  • Se le ultime due cifre dell'anno in corso vanno da 00 a 49, le prime 2 cifre dell'anno restituito sono 1 in meno delle prime 2 cifre dell'anno in corso.
  • Se le ultime due cifre dell'anno in corso sono comprese tra 50 e 99, l'anno restituito avrà le stesse prime due cifre dell'anno in corso.
Si noti che sto solo parlando del caso in cui si specifica l'anno utilizzando due cifre, se si specifica l'anno con quattro cifre, la maschera YY verrà automaticamente sostituita dalla maschera YYYY e la maschera RR - RRRR.
--Richiesta # 19 select to_date ("1950", "RR") "50RR", to_date ("1950", "YY") "50YY" da dual;
Pertanto, la query # 19 restituirà 1950 in entrambi i casi.

Esempio n. 7. Alcuni altri esempi
Alla fine della recensione, diamo un'occhiata a un po' di esotico. Si verificherà un errore a seguito dell'esecuzione della seguente query:
--Richiesta # 20 seleziona DATA "1928-12-25" da dual;
Se decidi che questa è una voce priva di significato, ti sbagli: si tratta di un'impostazione della data completamente corretta in conformità con lo standard ANSI, la query n. 20 avrà esito positivo e restituirà il 25/12/1928.

Quale richiesta non andrà a buon fine?
--Request # 21 select to_date ("1998-JAN-25 17:30", "YYYY-MON-DD HH24: MI", "NLS_DATE_LANGUAGE = AMERICAN") da dual; --Request # 21 select to_date ("1998-GENNAIO-25 17:30", "AAAA-MON-GG HH24: MI", "NLS_DATE_LANGUAGE = RUSSIAN") da dual;
Questo esempio ha lo scopo di dimostrare la presenza di un terzo parametro nella funzione to_date. Questo parametro consente di impostare il valore di uno dei parametri NLS (National Language Support) solo per questa chiamata alla funzione to_date. Abbiamo considerato l'impostazione dei parametri NLS per una sessione nell'esempio n. 5. La differenza fondamentale tra le richieste #20 e #21 non sta nel nome del mese (la maschera LUN viene automaticamente sostituita dalla maschera MESE, come descritto nell'esempio 5), ma nell'indicazione lingue differenti date. La richiesta n. 21 prevede il nome del mese in inglese e, di conseguenza, non verrà eseguita, la richiesta n. 22 prevede il nome del mese in russo e verrà eseguita correttamente.

Quando la seguente dichiarazione di tabella può causare errori durante l'inserimento dei dati?
--Request # 23 create table for_test (a number, b date default to_date ("09/11/2011"));
Ogni volta che una sessione con il formato di data predefinito "DD.MON.RR" inserirà con solo il valore della prima colonna inserire in for_test (a) i valori (1); verrà generato un errore.

Funzionalità di visualizzazione delle date in varie applicazioni

Cosa influenza la visualizzazione della data
Questa sezione è stata aggiunta dopo la pubblicazione dell'articolo grazie alle linee guida fornite nei commenti. Quanto segue è vero sia per la visualizzazione delle date che per la visualizzazione dei numeri. Probabilmente, durante l'esecuzione di alcuni degli esempi riportati sopra nell'articolo, hai ricevuto date in un formato diverso da quello specificato nei risultati. Se le impostazioni per la tua sessione corrispondevano a quelle indicate negli esempi, allora questo sembra almeno strano.

La verità è che quando esegui una query
--Richiesta # 24 seleziona sysdate da dual; si ottiene una data, ma per visualizzare il risultato sullo schermo l'utility specifica con cui si accede al database deve convertire la data in una stringa. Quindi to_char viene chiamato implicitamente per visualizzare date (e numeri), ad es. abbiamo un classico caso di conversione implicita (questa è una conversione solo per la visualizzazione sullo schermo, i suoi risultati non partecipano ad alcun calcolo e non influenzano altro che la visualizzazione dei dati). Se c'è una conversione implicita, c'è anche una maschera con cui viene eseguita. Nel caso classico, è deve essere la maschera impostata per la sessione, ovvero la maschera specificata nel parametro NLS_DATE_FORMAT della tabella nls_session_parameters, con cui abbiamo lavorato attivamente in tutto l'articolo.

Proviamo alcune delle applicazioni. Verificheremo utilizzando il seguente script:
--Request # 25 --Controlla i parametri di sessione predefiniti select * from nls_session_parameters dove parametro in ("NLS_DATE_FORMAT", "NLS_DATE_LANGUAGE"); - Visualizza la data seleziona sysdate da dual; - Modificare i parametri di sessione predefiniti alterare il set di sessione NLS_DATE_FORMAT = "DD.MON.RR hh24: mi: ss"; - Visualizza la data seleziona sysdate da dual;
Controlliamo quali parametri utilizza sqlplus per visualizzare le date.

Riso. 1. Risultato della query n. 25 in sqlplus.

Come si può vedere dalla Fig. 1, il formato di visualizzazione della data cambia a seconda delle impostazioni della sessione, ad es. sqlplus utilizza le impostazioni di sessione. Ciò semplifica la comprensione del processo di conversione delle date in stringhe e viceversa, poiché vengono utilizzate le stesse maschere per la conversione e la visualizzazione.

Alcuni strumenti di sviluppo avanzati utilizzano le proprie impostazioni NLS che non sono correlate alle impostazioni Oracle. Ad esempio, controlliamo quali parametri utilizza PL / SQL Developer per visualizzare le date. Per fare ciò, eseguiamo la query n. 25 al suo interno.


Riso. 2. Il risultato dell'esecuzione della query n. 25 in PL/SQL Developer.

Come si può vedere dalla Fig. 2, il formato di visualizzazione della data non cambia quando vengono modificate le impostazioni della sessione. Inoltre, se guardi da vicino, puoi vedere che sia il primo che il secondo risultato della visualizzazione della data sullo schermo non corrispondevano ai parametri della sessione (nel primo caso, la data visualizzata aveva un anno in formato a quattro cifre, e la maschera indicava l'anno in formato a due cifre). Ciò significa che l'utilità utilizza le proprie impostazioni NLS, nel caso di PL / SQL Developer, la loro posizione è mostrata in Fig. 3.


Riso. 3. Impostazione dei parametri NLS per la visualizzazione delle date in PL / SQL Developer.

Perché le impostazioni dell'utilità NLS possono essere dannose
La visualizzazione di una data in un formato diverso da quello della sessione è dannosa per un motivo: fuorvia l'utente e può causare errori. Eseguiamo la seguente query in sqlplus e PL/SQL Developer:
--Request # 26 --Modifica i parametri di sessione predefiniti alterando il set di sessione NLS_DATE_FORMAT = "DD.MON.RR hh24: mi: ss"; - Visualizza la data seleziona sysdate da dual; - Stiamo cercando di convertire i dati ricevuti dalla query precedente in una data select to_date (XXXXXXXX) da dual; Nell'ultima riga della query, al posto di XXXXXXXX, inseriremo quelli ottenuti da riga precedente dati.

I risultati dell'esecuzione della query sono mostrati nelle figure seguenti.


Riso. 4. Risultato della query n. 26 in sqlplus.


Riso. 5. Risultato della query n. 26 in PL / SQL Developer.

Perché in sqlplus i dati visualizzati sullo schermo sono stati convertiti correttamente in data, ma i dati visualizzati sullo schermo da PL/SQL Developer non possono essere convertiti? Perché per la conversione Oracle utilizza il formato dei dati specificato nella sessione e l'output dei dati da PL / SQL Developer è stato fornito per la visualizzazione nel proprio formato, diverso dal formato della sessione.

Conclusione

In conclusione, voglio ricordarti che in quasi tutti i post dedicati al lavoro con le date, Tom Kite parla della necessità di utilizzare trasformazioni esplicite e dell'indicazione obbligatoria di una maschera. "Quando si converte una stringa in una data, non fare mai affidamento sul formato della data predefinito, specificare sempre esplicitamente una maschera" è come suonano le sue parole. Esempi aggiuntivi e possibili errori quando lavori con le conversioni di data, puoi trovarlo utilizzando la pagina chiedi a Tom.

Poiché il lavoro con le date ha occupato l'intero articolo, molti domande interessanti che vorrei considerare. Molto probabilmente, la terza parte dell'articolo apparirà non appena avrò tempo libero.

Nell'articolo precedente, abbiamo esaminato le funzioni integrate per lavorare con le stringhe. In questo articolo sarà sulle funzioni per lavorare con data/ora e funzioni di conversione del tipo per le date. Oracle fornisce un tipo speciale DATE per la memorizzazione di data e ora. Da un punto di vista fisico, questo è un numero frazionario, la cui parte intera memorizza il numero di giorni da una certa data di base e la parte frazionaria memorizza l'ora. Ciò consente di eseguire operazioni aritmetiche sulle date: addizione e sottrazione.

Funzione SYSDATE

Questa è una delle funzioni più comunemente usate, restituisce data odierna e l'ora in base all'orologio del server.

LAST_DAY (d) funzione

Restituisce l'ultimo giorno del mese specificato in data d.

SELEZIONA SISTEMA d,

LAST_DAY (SYSDATE) d1

MESI_BETWEEN funzione (d1, d2)

La funzione MONTH_BETWEEN restituisce il numero di mesi tra due date d1 e d2, dato il segno come d1-d2, il numero restituito è una frazione.

SELECT MONTHS_BETWEEN ("2.09.2006", "2.05.2006") d1,

MESI_TRA ("09/12/2006", "2.05.2006") d2,

MESI_TRA ("2.05.2006", "12.09.2006") d3

Tenere conto esempi tipici- troncare la data a ore, giorni, mesi e anni. La maschera di formato predefinita è "DD"

SELEZIONA SISTEMA d1,

TRONCO (SYSDATE, "HH24") d2,

TRONCO (SYSDATE, "DD") d3,

TRONCO (SYSDATE, "MM") d4,

TRONCO (SYSDATE, "AAAA") d5

Maschere di formato valide per le funzioni TRUNC e ROUND

Diamo un'occhiata più da vicino alle maschere di formato e alle peculiarità del loro utilizzo.

Maschera

Appuntamento

Primo giorno del secolo

ANNO, o AAAA, o AA, o Y

Primo giorno dell'anno

Primo giorno del trimestre

MESE o LUN o MM

Primo giorno del mese

Stesso giorno della settimana del primo giorno dell'anno in corso

Stesso giorno della settimana del primo giorno del mese in corso

GIORNO o GIORNO o GIORNO

Primo giorno della settimana

HH o HH12 o HH24

Funzione TO_DATE (str [, mask [, nls_lang]])

La funzione TO_DATE converte la stringa str in una data. La trasformazione viene eseguita in base alla maschera maschera, se specificata. Se non viene specificata alcuna maschera, viene utilizzata la maschera predefinita. Se specifichi una maschera, puoi specificare un altro parametro: la lingua utilizzata durante la formattazione dei nomi di mesi e giorni. In caso di errore nell'analisi della stringa str secondo la maschera specificata, viene sollevata un'eccezione. L'errore più comune è "ORA-01830: il modello di formato della data termina prima di convertire l'intera stringa di input". Inoltre, l'errore "ORA-01821: formato data non riconosciuto" non è raro: si verifica quando viene specificata una maschera di formato non valida.

SELEZIONA A_DATA ("12.09.2006") d

Maschere di formato consentite per le funzioni TO_CHAR in caso di formattazione della data

Un secolo, e un segno meno è posto davanti alle date aC.

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE-1000000, "SCC") d2

26.09.2006 17:14:21

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "YYYY") d2

Anno scritto in lettere, tenendo conto della lingua nazionale corrente.

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "YEAR") d2

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "MM") d2

Nome del mese in parole.

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "MESE") d2

Settimana dell'anno.

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "WW") d2

Giorno dell'anno.

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "DDD") d2

Il giorno della settimana in lettere, se necessario, riempito fino a nove caratteri con spazi.

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "DAY") d2

data giuliana. È il numero di giorni da 1.01.4712 aC.

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "J") d2

L'ora del giorno su una scala di 12 ore (1-12).

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "HH") d2

Minuti (0-59).

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "MI") d2

Questa maschera formato è utile per misurare gli intervalli di tempo in secondi.

Segni di punteggiatura. Vengono emessi nelle posizioni appropriate nella data formattata.

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "GG.MM.AAAA HH24.MI") d2,

TO_CHAR (SYSDATE, "GG / MM / AAAA HH12.MI PM") d3

Formatta gli elementi della maschera destinati all'output informazioni di testo, case sensitive: controlla le maiuscole e minuscole del testo formattato. Si consideri la gestione del registro utilizzando come esempio la maschera formato GIORNO:

SELEZIONA SISTEMA d1,

TO_CHAR (SYSDATE, "DAY") d2,

TO_CHAR (SYSDATE, "Giorno") d3,

TO_CHAR (SYSDATE, "giorno") d4

26.09.2006 17:47:45

È facile vedere che se la maschera è scritta in maiuscolo, allora la formattata valore del testo restituisce in maiuscolo. Se è in quello inferiore, il valore da formattare sarà anche in quello inferiore. Infine, registrando la maschera con lettera maiuscola porta alla formattazione del testo generato in modo che inizi con una lettera maiuscola.

Conclusione

In questo articolo, abbiamo trattato tutte le principali funzioni integrate di Oracle per lavorare con le date ed eseguire conversioni di tipo con il tipo "data". Nel prossimo articolo, esamineremo le funzioni per la conversione e la formattazione dei numeri e passeremo a esaminare le query pratiche utilizzando le funzioni discusse in precedenza.

Oracle implementa una serie di funzioni per lavorare con i valori di data/ora. Non esamineremo in dettaglio tutte le funzioni, ma un riepilogo in tabella. 1 ti presenterò a opportunità disponibili... Se sei interessato a qualche funzione, per favore contatta descrizione dettagliata alla directory Oracle SQL Riferimento.

Evitare l'uso tradizionale Funzioni Oracle elaborare i valori DATE quando si lavora con i nuovi tipi di dati TIMESTAMP. Utilizzare invece le nuove funzioni di tipo INTERVAL quando possibile. Le funzioni DATE devono essere utilizzate solo per elaborare i valori DATE.

Molti di quelli riportati in tabella. 1 le funzioni (incluso ADD_MONTHS) ricevono i valori DATE. Possono sorgere problemi quando si utilizzano tali funzioni con i nuovi tipi di dati TIMESTAMP. Sebbene a qualsiasi di queste funzioni possa essere passato un valore TIMESTAMP, Oracle lo converte implicitamente in DATE e solo allora la funzione completerà la sua attività, ad esempio:

DICHIARA ts TIMESTAMP CON FUSO ORARIO; BEGIN ts: = SYSTIMESTAMP; --Nota: il valore della variabile ts specifica i --frazioni di secondo E il fuso orario. DBMS_OUTPUT.PUT_LINE (ts); --Cambiare il valore ts di una delle funzioni integrate. ts: = LAST_DAY (ts); --I secondi frazionari vengono PERDUTI e il fuso orario viene sostituito dal fuso orario della sessione. DBMS_OUTPUT.PUT_LINE (ts); FINE;

Risultato:

Nome Descrizione
AGGIUNGI_MESI Restituisce il valore DATA risultante dall'incremento valore impostato DATE per il numero di mesi specificato. Vedi "Somma e sottrazione di intervalli"
LANCIO Esegue conversioni tra tipi di dati, ad esempio tra DATE e significati diversi ORARIO. Vedi "CAST ed ESTRATTO"
DATA ODIERNA Restituisce la data e l'ora correnti nel fuso orario della sessione come valore DATE
CURRENT_TIMESTAMP Restituisce la data e l'ora correnti nel fuso orario della sessione come TIMESTAMP WITH TIME ZONE
DBTIMEZONE Restituisce l'offset del fuso orario del database da UTC, sotto forma di una stringa di caratteri (ad esempio, "-05: 00"). Il fuso orario del database viene utilizzato solo quando si lavora con valori di tipo TIMESTAMP WITH LOCAL TIME ZONE
ESTRATTO Restituisce un valore NUMBER o VARCHAR2 contenente un elemento data/ora specifico — ora, anno o abbreviazione del fuso orario. Vedi "CAST ed ESTRATTO"
FROM_TZ Converte TIMESTAMP e i dati del fuso orario in TIMESTAMP WITH TIME ZONE
ULTIMO GIORNO Restituisce l'ultimo giorno del mese per un dato valore di input DATE
LOCALTIMESTAMP Restituisce la data e l'ora correnti come TIMESTAMP nel fuso orario locale
MESI_ TRA Restituisce un valore NUMBER contenente il numero di mesi tra due date. Vedi "Calcolo dell'intervallo tra due valori DATE"
NUOVO TEMPO Converte un valore DATE da un fuso orario a quello di un altro fuso orario. La funzione esiste per mantenere la compatibilità con il codice legacy; le nuove applicazioni dovrebbero utilizzare TIMESTAMP WITH TIME ZONE o TIMESTAMP WITH LOCAL TIME ZONE
GIORNO DOPO Restituisce la data del primo giorno della settimana successivo alla data specificata
NUMTODSINTERVAL Converte il numero specificato di giorni, ore, minuti o secondi (a scelta) in un valore INTERVAL DAY TO SECOND
NUMTOYMINTERVAL Converte un numero specificato di anni e mesi (a tua scelta) in un valore INTERVAL YEAR TO MONTH
IL GIRO Restituisce un valore DATE arrotondato alle unità specificate
SESSIONTIMEZONE Restituisce l'offset del fuso orario della sessione (relativo all'UTC) come stringa di caratteri
SYS_EXTRACT_UTC Converte un TIMESTAMP WITH TIME ZONE in un TIMESTAMP con la stessa data e ora, normalizzato in UTC
SYSDATA Restituisce la data e l'ora correnti del server Oracle come DATA
SYSTIMESTAMP Restituisce la data e l'ora correnti del server Oracle come TIMESTAMP WITH TIME ZONE
TO_CHAR Converte un valore di data/ora in una stringa di caratteri. Vedere "Conversione di data e ora"
AD OGGI Converte una stringa di caratteri in un valore DATE. Vedere "Conversione di data e ora"
TO_DSINTERVAL Converte una stringa di caratteri in INTERVAL DAY TO SECOND. Vedi "Conversioni di spaziatura"
TO_TIMESTAMP Converte una stringa di caratteri in un valore TIMESTAMP. Vedere "Conversione di data e ora"
TO_TIMESTAMP_TZ Converte una stringa di caratteri in un valore TIMESTAMP WITH TIME ZONE. Vedere "Conversione di data e ora"
TO_YMINTERVAL Converte una stringa di caratteri in INTERVAL YEAR TO MONTH. Vedi "Conversioni di spaziatura"
TRONCO Restituisce una DATA troncata alle unità specificate
TZ_OFFSET Restituisce l'offset UTC del fuso orario specificato per nome o abbreviazione, nel formato VARCHAR2 (ad esempio, "-05: 00")

In questo esempio, la variabile ts contiene un valore di tipo TIMESTAMP WITH TIME ZONE. Questo valore viene convertito implicitamente in DATE quando viene passato LAST_DAY. Poiché il tipo DATE non memorizza frazioni di secondo o offset di fuso orario, queste parti del valore ts vengono semplicemente scartate. Il risultato di LAST_DAY viene nuovamente assegnato a ts, il che si traduce in una seconda conversione implicita: questa volta, DATE viene convertito in TIMESTAMP WITH TIME ZONE. La seconda trasformazione ottiene il fuso orario della sessione, quindi vediamo 05:00 nell'offset del fuso orario nel valore finale.

Principali articoli correlati