Il formato data predefinito di Oracle è AAAA-MM-GG, PERCHÉ?

Il formato data predefinito di Oracle è AAAA-MM-GG. Il che significa se lo faccio:

select some_date from some_table 

Perdo la parte del tempo del mio appuntamento.

Sì, so che puoi “aggiustarlo” con:

  alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 

Ma seriamente, perché non è il valore predefinito sopra? Soprattutto in un DBMS in cui i due tipi di dati di tracciamento temporale principali (DATE e TIMESTAMP) hanno entrambi un componente temporale che include (almeno) precisione fino a 1 secondo.

Se si utilizza questa query per generare un file di input per il data warehouse, è necessario formattare i dati in modo appropriato. Essenzialmente in questo caso stai convertendo la data (che ha un componente temporale) in una stringa. È necessario formattare in modo esplicito la stringa o modificare il proprio nls_date_format per impostare il valore predefinito. Nella tua domanda potresti semplicemente fare:

 select to_char(some_date, 'yyyy-mm-dd hh24:mi:ss') my_date from some_table; 

Sei sicuro di non confondere il database Oracle con Oracle SQL Developer?

Il database stesso non ha un formato data, la data esce dal database in forma grezza. Spetta al software client renderizzarlo e SQL Developer utilizza YYYY-MM-DD come formato predefinito, che è quasi inutile, sono d’accordo.

modifica: come è stato commentato di seguito, SQL Developer può essere riconfigurato per visualizzare correttamente i valori DATE, ha solo cattive impostazioni predefinite.

Il formato AAAA-MM-GG fa parte di ISO8601 uno standard per lo scambio di informazioni sulla data (e sull’ora).

È molto coraggioso da parte di Oracle adottare uno standard ISO come questo, ma allo stesso tempo, strano, non sono andati fino in fondo .

In generale le persone resistono a qualcosa di diverso, ma ci sono molte buone ragioni internazionali per questo.

So che sto dicendo cose rivoluzionarie, ma dovremmo tutti abbracciare gli standard ISO, anche se lo facciamo un po ‘alla volta .

Il più grande PITA di Oracle è che non ha un formato data predefinito!

Nella tua installazione di Oracle, la combinazione di Local e opzioni di installazione ha scelto (il molto sensato!) YYYY-MM-DD come formato per l’output delle date. Un’altra installazione potrebbe aver selezionato “GG / MM / AAAA” o “AAAA / GG / MM”.

Se vuoi che il tuo SQL sia trasferibile su un altro sito Oracle, ti consiglio di TO_CHAR(datecol,'YYYY-MM-DD') sempre un TO_CHAR(datecol,'YYYY-MM-DD') o una funzione simile attorno a ogni colonna della data, il tuo SQL o in alternativa impostare il formato defualt immediatamente dopo la connessione con

 ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; 

o simili.

Non è mai saggio affidarsi a valori predefiniti impostati su un valore particolare, IMHO, indipendentemente dal fatto che si tratti di formati di data, formati di valuta, modalità di ottimizzazione o altro. È necessario impostare sempre il valore del formato data necessario nel server, nel client o nell’applicazione.

In particolare, non fare mai affidamento su valori predefiniti durante la conversione di tipi di dati numerici o dati per scopi di visualizzazione, poiché una singola modifica al database può interrompere l’applicazione. Usa sempre un formato di conversione esplicito. Per anni ho lavorato su sistemi Oracle in cui il formato predefinito di visualizzazione data predefinito era MM / DD / RR, il che mi ha fatto impazzire ma almeno mi ha costretto a utilizzare sempre una conversione esplicita.

La maggior parte dell’IDE è ansible configurare la maschera predefinita per alcuni tipi di dati come data, valuta, separatore decimale, ecc.

Se stai usando Oracle SQL Developer :

Strumento> Preferenze> Database> NLS

Formato data: AAAA-MM-GG HH24: MI: SS

Questo è un “problema” sul lato client, non proprio un problema Oracle.

È l’applicazione client che formatta e visualizza la data in questo modo.

Nel tuo caso è SQL * Plus che esegue questa formattazione.
Altri client SQL hanno altre impostazioni predefinite.

Un valore DATE per lo standard SQL è YYYY-MM-DD. Quindi, anche se Oracle memorizza le informazioni sull’ora, suppongo che stiano visualizzando il valore in un modo compatibile con lo standard SQL. Nello standard, c’è il tipo di dati TIMESTAMP che include le informazioni su data e ora.

Non sono un utente Oracle (beh, ultimamente comunque), MA …

Nella maggior parte dei database (e in una lingua precisa), una data non include un orario. Avere una data non implica che tu stia indicando un secondo specifico in quella data. In genere se si desidera un orario e una data, viene chiamato un timestamp.

Oracle ha sia i tipi di dati Date che Timestamp.

Secondo la documentazione Oracle , ci sono differenze nella dimensione dei dati tra Data e Timestamp, quindi quando l’intenzione è di avere un campo Data solo ha senso mostrare la formattazione della Data. Inoltre, “Non ha secondi frazionari o un fuso orario.” – quindi non è la scelta migliore quando sono richieste informazioni sull’orario.

Il campo Data può essere facilmente formattato per mostrare il componente orario in Oracle SQL Developer – La query Date eseguita in PL / SQL Developer mostra il tempo, ma non viene visualizzata in Oracle SQL Developer . Ma non mostrerà i secondi frazionari o il fuso orario – per questo è necessario il tipo di dati Timestamp.

motivo: se stai guardando una colonna di dati con un timestamp, il bit di informazione _MOST_IMPORTANT_ è l’anno. Se i dati sono stati nel db per dieci anni, è importante saperlo. così l’anno viene prima.

ha senso che il mese sarebbe arrivato dopo, poi il giorno, l’ora, il minuto. Oggettivamente, queste sono la sequenza più logica per la visualizzazione dei dati temporali.

ha anche senso che se si visualizzano i dati per impostazione predefinita, è necessario visualizzare solo la parte più significativa dei dati, quindi, per impostazione predefinita, solo YMD. tutto il resto può essere visualizzato, ma non confonde il rapporto sql per impostazione predefinita.

Ordinare per data è logico se si visualizza YMD perché è sequenziale. I computer sono buoni in sequenza e sembra logico.

finalmente. Il tuo pregiudizio nel volere MDY è il tuo pregiudizio. Non tutti, anche negli Stati Uniti, usano questo formato. Quindi usa il formato più logico e non essere indignato quando gli altri decidono di essere logici per impostazione predefinita.

(Sono nato negli Stati Uniti e non rappresento Oracle. Posso, tuttavia, pensare da solo)

Per rispondere alla tua domanda per la quale la data predefinita WHY non visualizza la parte TIME, l’unica risposta che trovo è

I team Oracle sono composti da sviluppatori o responsabili LAZY 🙂

Perché ?

Perché i tipi di dati DATE, TIME e DATETIME esistono in SQL e Oracle non l’ha ancora implementato !!!

È un peccato per Oracle.

Ma la risposta corretta al tuo problema non è definire un formato predefinito FIX, ma un formato predefinito SIGNIFICANTE che visualizza solo cifre significative in modo che i valori DATE, TIME o DATETIME visualizzati (per impostazione predefinita) contengano sempre tutte le cifre importanti.

Esempio:

 2015-10-14 will be displayed as 2015-10-14 (or default DATE format) 2018-10-25 12:20:00 will be displayed as 2018-10-25 12:20 1994-04-16 16 will be displayed as 1994-04-16 16 

Il principio è semplice.

Tutte le cifre che fanno parte di DATE verranno sempre visualizzate come parte INTEGER del numero float. Per la parte TIME, verrà visualizzata solo la parte significativa come per la parte DECIMAL nel numero float. Naturalmente, per il tipo TIME (solo HH: MM: SS), la parte DATE non viene mai visualizzata.