Condividi tramite


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 9999e , 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
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 Tdue 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