Introduzione
I tipi di dati sono attributi che specificano il tipo di dati che oggetti come colonne, variabili locali, espressioni e parametri possono contenere. In tutto il mondo RDBMS, i tipi di dati sono generalmente raggruppati in tipi di dati stringa, numerici e di data.
T-SQL supporta 6 tipi di dati di data e ora, vale a dire:
- Data e ora
- Smalldatetime
- Data
- Tempo
- Dataora2
- Offset data/ora
I primi due tipi di dati sono considerati versioni legacy di quelli più recenti. In questo articolo, ci concentriamo sui tipi di dati della data e, in particolare, sul datetime e dataora2 tipi di dati disponibili in SQL Server. La tabella 1 fornisce i dettagli dei vari tipi di dati di data e ora disponibili in SQL Server.
[id tabella=59 /]
Scheda 1 Tipi di dati di data e ora
Dataora e Dataora2
Datatime è un tipo di dati che combina data e ora in un formato di 24 ore. L'intervallo di date supportato nel tipo di dati datetime è quello mostrato nella Tab 1 e ha una precisione di circa 3 millisecondi.
Datetime2 è un'estensione del tipo di dati datetime. Accoglie una gamma più ampia di valori possibili e ha una precisione di 100 nanosecondi, che è molto migliore del suo predecessore. Un altro aspetto fondamentale del tipo di dati dattime2 è che lo spazio di archiviazione richiesto varia da 6 a 8 byte a seconda della precisione scelta.
- Puoi ottenere una precisione di 1 millisecondo consentendo tre posizioni decimali sul componente dei secondi. Ogni valore consumerà quindi sei byte.
- Puoi ottenere una precisione di 100 nanosecondi consentendo sette posizioni decimali sulla componente dei secondi. Ogni valore consumerà quindi otto byte.
Dimostrazioni
Inserisci valori di data errati
Creiamo una tabella con i dettagli mostrati nel Listato 1 per eseguire alcune dimostrazioni che illustrano come manipolare la data/ora e dataora2 tipi di dati.
-- Listing 1 Create Table and insert Rows -- Create Table with Data Types use Practice2017 go create table staffers ( fname varchar(50), lname varchar(50), JobTitle varchar(100), DOB datetime, PreciseDOB datetime2, LastLoginTime time) go
Quindi proviamo a popolare la tabella con una riga come mostrato nel Listato 2 ma otteniamo l'errore mostrato in Fig. 1. La parola chiave nel messaggio di errore è valori "fuori intervallo". Quello che sta dicendo è che il suo valore che stiamo cercando di inserire è inferiore a 01-Jan-1753 o superiore a 31-dic-9999 . In questo caso, il problema è che non abbiamo utilizzato il formato di immissione consigliato di "AAAAMMGG hh:mm:ss.nnn ' (vedi tabella 1). Lettura del valore "06101979 ', SQL Server presuppone che 0610 sia l'anno (corrispondente a AAAA). Questo errore non viene generato per il tipo di dati datetime2 perché l'intervallo per datetime2 è più ampio a partire dall'anno 0001.
-- Listing 2 Insert Rows with Wrong Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06101979' ,'06101979' ,'8:00 AM' )
Fig. 1 Errore restituito per la colonna DateTime
Inserisci valori di data corretti
Cerchiamo di correggere il problema immettendo il formato di immissione corretto per la colonna datetime come mostrato nel Listato 3. Quando eseguiamo di nuovo l'istruzione, otteniamo l'errore mostrato in Fig. 2. Questo errore è essenzialmente causato dallo stesso errore nel seguire le specifiche del formato di ingresso. Tuttavia, il problema risiede nell'altra parte della data "06101979 ' che corrisponde al formato di immissione 'AAAAMMGG hh:mm:ss.nnn '. In questo caso, SQL Server presuppone 19 Manca un mese e 79 è un giorno del mese. Il tentativo di questa conversione implicita non riesce poiché nessuna delle precedenti asserzioni è vera.
-- Listing 3 Insert Rows with One Correct Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'01061979' ,'8:00 AM' )
Fig. 2 Errore restituito per la colonna Datetime2
Il Listato 4 ci permette di dimostrare l'ultima affermazione. Il valore 01101201 rientra nell'intervallo per datetime2 e siamo in grado di inserire la riga. Questo valore si traduce in 1 dicembre 0110 come si vede nella figura 3.
-- Listing 4: Insert Rows with Correct Date Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'01101201' ,'8:00 AM')
-- Listing 5: Insert Rows with All Correct Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'19791006' ,'8:00 AM' )
Verifica dei dati
Fig. 3 Interrogazione del set di dati
Quando interroghiamo la tabella staffers vediamo chiaramente la precisione del tipo di dati datetime rispetto all'alternativa datetime2. Passiamo a qualcosa di un po' più sinistro:le impostazioni della lingua. Dai un'occhiata al Listato 6. Stiamo inserendo esattamente gli stessi record utilizzando il formato della data 06/10/1979 . Questo formato NON è neutrale rispetto alla lingua, quindi quando impostiamo la lingua su britannico nella prima istruzione e poi a us_english nella seconda troviamo che abbiamo inserito due date diverse in realtà anche se i nostri valori grezzi sono gli stessi. Questo è il motivo per cui è così importante utilizzare sempre il formato di immissione consigliato quando si ha a che fare con datetime e dataora2 .
-- Listing 6: Impact of Language Settings set language british insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06/10/1979' ,'06/10/1979' ,'8:00 AM' ) set language us_english insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06/10/1979' ,'06/10/1979' ,'8:00 AM' )
Fig. 4 Interrogazione del personale
Con l'impostazione della lingua britannica , SQL Server interpreta le prime due cifre come il giorno ma con l'impostazione della lingua come us_english , SQL Server interpreta le prime due cifre come un mese. Un'ultima cosa che dobbiamo menzionare qui è che nell'inserimento dei nostri record, non abbiamo specificato il componente dell'ora, quindi SQL Server presume automaticamente che fosse la mezzanotte media della data specificata.
Conclusione
In questo articolo, abbiamo appreso che aspetto hanno i tipi di dati datetime e datetime2, le loro differenze principali e come assicurarci di inserire la data corretta quando si utilizzano questi tipi di dati. Nel corso di questo, abbiamo anche esaminato due errori in cui potrebbe incorrere uno sviluppatore quando lavora con questi tipi di dati.
Riferimenti
- Tipi di dati SQL
- Ben-Gan, I. (2016) Fondamenti di T-SQL. pp74-78. Microsoft Press.