datetime2 (Transact-SQL)
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL di Azure Synapse Analytics Platform System (PDW) in Microsoft Fabric Warehouse nel database SQL di Microsoft Fabric in Microsoft Fabric
Definisce una data costituita dalla combinazione di un'ora del giorno espressa nel formato 24 ore. datetime2 può essere considerato un'estensione del tipo datetime esistente con un più ampio intervallo di date, una maggiore precisione frazionaria predefinita e una precisione specificata dall'utente facoltativa.
Descrizione di datetime2
Proprietà | valore |
---|---|
Sintassi | datetime2 [ (precisione in secondi frazionari) ] |
Utilizzo | DECLARE @MyDatetime2 datetime2(7); CREATE TABLE Table1 (Column1 datetime2(7)); |
Formato predefinito dei valori letterali stringa (utilizzato per client legacy) |
yyyy-MM-dd HH:mm:ss[.nnnnnnn] Per altre informazioni, vedere Compatibilità con le versioni precedenti per i client di livello inferiore più avanti in questo articolo. |
Intervallo di date | 0001-01-01 attraverso 9999-12-31 Dal 1 gennaio 1 al 31 dicembre 9999 |
Intervallo di tempo | 00:00:00 attraverso 23:59:59.9999999 |
Intervallo di differenze di fuso orario | None |
Intervalli di elementi | yyyy è un numero a quattro cifre, compreso tra 0001 9999 e , che rappresenta un anno.MM è un numero a due cifre, compreso tra 01 e 12 , che rappresenta un mese nell'anno specificato.dd è un numero a due cifre, compreso tra 01 e a 31 seconda del mese, che rappresenta un giorno del mese specificato.HH è un numero a due cifre, compreso tra 00 e 23 , che rappresenta l'ora.mm è un numero a due cifre, compreso tra 00 e 59 , che rappresenta il minuto.ss è un numero a due cifre, compreso tra 00 e 59 , che rappresenta il secondo.n* è un numero da zero a sette cifre da 0 a 9999999 , che rappresenta i secondi frazionari. In Informatica i secondi frazionari vengono troncati quando n è minore di 3 . |
Lunghezza in caratteri | Da 19 posizioni minime (yyyy-MM-dd HH:mm:ss ) a 27 massimo (yyyy-MM-dd HH:mm:ss.0000000 ) |
Precisione, scala | da 0 a 7 cifre, con un'accuratezza di 100 nanosecondi (100 ns). La precisione predefinita è 7 cifre. In Microsoft Fabric Data Warehouse questa precisione può essere un numero intero compreso tra 0 e 6, senza impostazione predefinita. La precisione deve essere specificata in Microsoft Fabric Data Warehouse. |
Dimensioni dello spazio di archiviazione 1 | 6 byte per una precisione inferiore a 3. 7 byte per una precisione compresa tra 3 e 4. Tutte le altre precisioni richiedono 8 byte. 2 |
Precisione | 100 nanosecondi |
Default value | 1900-01-01 00:00:00 |
Calendario | Gregoriano |
Precisione in secondi frazionari definita dall'utente | Sì |
Considerazione e conservazione delle differenze di fuso orario | No |
Considerazione dell'ora legale | No |
1 I valori specificati si riferiscono a rowstore non compresso. L'uso della compressione dei dati o columnstore può modificare le dimensioni di archiviazione per ogni precisione. Inoltre, le dimensioni di archiviazione su disco e in memoria potrebbero differire. Ad esempio, i valori di datetime2 richiedono sempre 8 byte in memoria quando si usa la modalità batch.
2 Quando viene eseguito il cast di un valore datetime2 a un valore varbinary, viene aggiunto un byte extra al valore varbinary per archiviare la precisione.
Per i metadati del tipo di dati, vedere sys.systypes o TYPEPROPERTY. Precisione e scala sono variabili per alcuni tipi di dati di data e ora. Per ottenere la precisione e la scala per una colonna, vedere COLUMNPROPERTY, COL_LENGTH o sys.columns.
Formati di valore letterale stringa supportati per datetime2
Nelle tabelle seguenti sono elencati i formati di valore letterale stringa ISO 8601 e ODBC supportati per datetime2. Per informazioni sui formati alfabetici, numerici, non temporaneamente e ora per le parti di data e ora di datetime2, vedere data e ora.
ISO 8601 | Descrizione |
---|---|
yyyy-MM-ddTHH:mm:ss[.nnnnnnn] |
Questo formato non è interessato dalle impostazioni locali della SET LANGUAGE sessione e SET DATEFORMAT . I T due punti (: ) e il punto (. ) sono inclusi nel valore letterale stringa, ad esempio 2024-05-02T19:58:47.1234567 . |
ODBC | Descrizione |
---|---|
{ ts 'yyyy-MM-dd HH:mm:ss[.nnnnnnn]' } |
Specifico delle API ODBC: Il numero di cifre a destra del separatore decimale che rappresenta i secondi frazionari comprende da 0 a 7 cifre (100 nanosecondi). |
Conformità agli standard ANSI e ISO 8601
La conformità agli standard ANSI e ISO 8601 di date e time si applica a datetime2.
Compatibilità con le versioni precedenti dei client
Alcune versioni precedenti dei client non supportano i tipi di dati time, date, datetime2 e datetimeoffset. Nella tabella seguente viene illustrato il mapping del tipo tra un'istanza di livello principale di SQL Server e i client legacy.
Tipo di dati di SQL Server | Formato predefiniti dei valori letterali stringa passati al client legacy | ODBC delle versioni precedenti | OLEDB delle versioni precedenti | JDBC delle versioni precedenti | SQLCLIENT delle versioni precedenti |
---|---|---|---|---|---|
time | HH:mm:ss[.nnnnnnn] | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Stringa o SqString |
date | yyyy-MM-dd | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Stringa o SqString |
datetime2 | Aaaa-MM-gg HH:mm:ss[.nnnnnnn] | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Stringa o SqString |
datetimeoffset | Aaaa-MM-gg HH:mm:ss[.nnnnnnn] [+|-]hh:mm | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Stringa o SqString |
Convertire i dati di data e ora
Quando si esegue la conversione in tipi di dati di data e ora, il motore di database rifiuta tutti i valori che non può riconoscere come date o ore. Per informazioni sull'uso delle funzioni CAST e CONVERT con dati di data e ora, vedere CAST e CONVERT
Convertire altri tipi di data e ora nel tipo di dati datetime2
Nella sezione seguente viene descritto il risultato della conversione di altri tipi di dati di data e ora nel tipo di dati datetime2.
Quando viene eseguita la conversione da date, vengono copiati anno, mese e giorno. Il componente relativo all'ora viene impostato su 00:00:00.0000000. Nel codice seguente vengono illustrati i risultati della conversione di un valore date
in un valore datetime2
.
DECLARE @date AS DATE = '12-21-16';
DECLARE @datetime2 AS DATETIME2 = @date;
SELECT @datetime2 AS '@datetime2',
@date AS '@date';
Il set di risultati è il seguente.
@datetime2 @date
--------------------------- ----------
2016-12-21 00:00:00.0000000 2016-12-21
Quando la conversione viene eseguita da time(n), il componente ora viene copiato e il componente data è impostato su 1900-01-01
. Nell'esempio seguente vengono illustrati i risultati della conversione di un valore time(7) in un valore datetime2 .
DECLARE @time AS TIME (7) = '12:10:16.1234567';
DECLARE @datetime2 AS DATETIME2 = @time;
SELECT @datetime2 AS '@datetime2',
@time AS '@time';
Il set di risultati è il seguente.
@datetime2 @time
--------------------------- ----------------
1900-01-01 12:10:16.1234567 12:10:16.1234567
Quando la conversione viene eseguita da smalldatetime, le ore e i minuti vengono copiati, mentre i secondi e i secondi frazionari vengono impostati su 0. Nel codice seguente vengono illustrati i risultati della conversione di un valore smalldatetime
in un valore datetime2
.
DECLARE @smalldatetime AS SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime2 AS DATETIME2 = @smalldatetime;
SELECT @datetime2 AS '@datetime2',
@smalldatetime AS '@smalldatetime';
Il set di risultati è il seguente.
@datetime2 @smalldatetime
--------------------------- -----------------------
2016-12-01 12:32:00.0000000 2016-12-01 12:32:00
Quando la conversione viene eseguita da datetimeoffset(n), i componenti di data e ora vengono copiati. Il fuso orario viene troncato. Nell'esempio seguente vengono illustrati i risultati della conversione di un valore datetimeoffset(7)
in un valore datetime2
.
DECLARE @datetimeoffset AS DATETIMEOFFSET (7) = '2016-10-23 12:45:37.1234567 +10:0';
DECLARE @datetime2 AS DATETIME2 = @datetimeoffset;
SELECT @datetime2 AS '@datetime2',
@datetimeoffset AS '@datetimeoffset';
Il set di risultati è il seguente.
@datetime2 @datetimeoffset
--------------------------- ----------------------------------
2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00
Quando la conversione è da datetime, la data e l'ora vengono copiate. La precisione frazionaria viene estesa a 7 cifre. Nell'esempio seguente vengono illustrati i risultati della conversione di un valore datetime
in un valore datetime2
.
DECLARE @datetime AS DATETIME = '2016-10-23 12:45:37.333';
DECLARE @datetime2 AS DATETIME2 = @datetime;
SELECT @datetime2 AS '@datetime2',
@datetime AS '@datetime';
Il set di risultati è il seguente.
@datetime2 @datetime
----------------------- ---------------------------
2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333
Eseguire il cast in modo esplicito a datetime2 quando si usa datetime
Con il livello di compatibilità del database 130 e versioni successive, le conversioni implicite dai tipi di dati datetime a datetime2 mostrano una maggiore accuratezza tenendo conto dei millisecondi frazionari, con conseguente conversione di valori diversi, come illustrato nell'esempio precedente. Usare il cast esplicito al tipo di dati datetime2 ogni volta che esiste uno scenario di confronto misto tra tipi di dati datetime e datetime2 . Per altre informazioni, vedere SQL Server e database SQL di Azure miglioramenti nella gestione di alcuni tipi di dati e operazioni non comuni.
Convertire i valori letterali stringa in datetime2
Le conversioni da valori letterali stringa a tipi di data e ora sono consentite se tutte le parti delle stringhe hanno formati validi. In caso contrario, viene generato un errore di runtime. Le conversioni implicite o le conversioni esplicite che non specificano uno stile, dai tipi di data e ora ai valori letterali stringa sono nel formato predefinito della sessione corrente. Nella tabella seguente vengono illustrate le regole per la conversione di un valore letterale stringa nel tipo di dati datetime2.
Valore letterale stringa di input | datetime2(n) |
---|---|
ODBC DATE |
Viene eseguito il mapping dei valori letterali stringa ODBC al tipo di dati datetime. Qualsiasi operazione di assegnazione da ODBC DATETIME valori letterali in tipi datetime2 causa una conversione implicita tra datetime e questo tipo, come definito dalle regole di conversione. |
ODBC TIME |
Vedere la regola precedente ODBC DATE . |
ODBC DATETIME |
Vedere la regola precedente ODBC DATE . |
Solo DATE |
Per impostazione predefinita, la TIME parte è 00:00:00 . |
Solo TIME |
Per impostazione predefinita, la DATE parte è 1900-01-01 . |
Solo TIMEZONE |
Vengono forniti i valori predefiniti. |
DATE + TIME |
Insignificante. |
DATE + TIMEZONE |
Non consentiti. |
TIME + TIMEZONE |
Il valore predefinito della DATE parte è 1900-1-1. TIMEZONE l'input viene ignorato. |
DATE + TIME + TIMEZONE |
Viene utilizzata la classe locale DATETIME . |
Esempi
Nell'esempio seguente vengono confrontati i risultati dell'esecuzione del cast di una stringa ai tipi di dati date e time.
SELECT CAST ('2007-05-08 12:35:29. 1234567 +12:15' AS TIME (7)) AS 'time',
CAST ('2007-05-08 12:35:29. 1234567 +12:15' AS DATE) AS 'date',
CAST ('2007-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
CAST ('2007-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
CAST ('2007-05-08 12:35:29. 1234567 +12:15' AS DATETIME2 (7)) AS 'datetime2',
CAST ('2007-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET (7)) AS 'datetimeoffset';
Il set di risultati è il seguente.
Tipo di dati | Output |
---|---|
time | 12:35:29.1234567 |
date | 2007-05-08 |
smalldatetime | 2007-05-08 12:35:00 |
datetime | 2007-05-08 12:35:29.123 |
datetime2 | 2007-05-08 12:35:29.1234567 |
datetimeoffset | 2007-05-08 12:35:29.1234567 +12:15 |