Share via


datetime2 (Transact-SQL)

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 [ (fractional seconds precision) ]

Utilizzo

DECLARE @MyDatetime2 datetime2(7)

CREATE TABLE Table1 ( Column1 datetime2(7) )

Formato predefinito dei valori letterali stringa

(utilizzato per client legacy)

AAAA-MM-GG hh:mm:ss[.secondi frazionari]

Per ulteriori informazioni, vedere la sezione seguente relativa alla compatibilità con le versioni precedenti per i client legacy.

Intervallo di date

Da 01-01-0001 a 31-12-9999

Da 1 gennaio 1 d.C. a 31 dicembre 9999 d.C

Intervallo di ore

Da 00:00:00 a 23:59:59.9999999

Intervallo di differenze di fuso orario

Nessuno

Intervalli di elementi

AAAA rappresenta un numero di quattro cifre compreso tra 0001 e 9999, indicante l'anno.

MM rappresenta un numero di due cifre compreso tra 01 e 12, indicante un mese dell'anno specificato.

GG rappresenta un numero di due cifre compreso tra 01 e 31, a seconda del mese, indicante il giorno del mese specificato.

hh rappresenta un numero di due cifre compreso tra 00 e 23, indicante l'ora.

mm rappresenta un numero di due cifre compreso tra 00 e 59, indicante i minuti.

ss rappresenta un numero di due cifre compreso tra 00 e 59, indicante i secondi.

n* rappresenta un numero composto da 0 a 7 cifre e compreso tra 0 e 9999999, indicante i secondi frazionari.

Lunghezza in caratteri

Da un minimo di 19 posizioni (AAAA-MM-GG hh:mm:ss ) a un massimo di 27 posizioni (AAAA-MM-GG hh:mm:ss.0000000)

Precisione, scala

Da 0 a 7 cifre, con un'accuratezza di 100 nanosecondi. La precisione predefinita è 7 cifre.

Dimensioni dello spazio di archiviazione

6 byte per le precisioni minori di 3; 7 byte per le precisioni 3 e 4. Tutte le altre precisioni richiedono 8 byte.

Accuratezza

100 nanosecondi

Valore predefinito

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

Per i metadati del tipo di dati, vedere sys.systypes (Transact-SQL) o TYPEPROPERTY (Transact-SQL). Precisione e scala sono variabili per alcuni tipi di dati di data e ora. Per ottenere precisione e scala per una colonna, vedere COLUMNPROPERTY (Transact-SQL), COL_LENGTH (Transact-SQL) o sys.columns (Transact-SQL).

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 alfabetico, numerico, non separato e ora per le parti di data e ora di datetime2, vedere date (Transact-SQL) e time (Transact-SQL).

ISO 8601

Descrizione

AAAA-MM-GGThh.mm.ss[. nnnnnnn]

AAAA-MM-GGThh.mm.ss[. nnnnnnn]

Su questo formato non influiscono le impostazioni locali delle sessioni SET LANGUAGE e SET DATEFORMAT. Il carattere T, i due punti (:) e il punto (.) sono inclusi nel valore letterale stringa, ad esempio '2007-05-02T19:58:47.1234567'.

ODBC

Descrizione

{ ts 'aaaa-mm-gg hh:mm:ss[.secondi frazionari]' }

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).

  • In SQL Server 2012, con livello di compatibilità impostato su 10 il valore letterale eseguirà il mapping internamente al tipo time nuovo.

Conformità agli standard ANSI e ISO 8601

La conformità agli standard ANSI e ISO 8601 di date e time è applicata a datetime2.

Compatibilità con le versioni precedenti dei client legacy

Alcuni client legacy 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 SQL Server 2012

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

Conversione dei dati relativi alla data e all'ora

Nella conversione di tipi di dati relativi alla data e all'ora, in SQL Server vengono rifiutati tutti i valori non riconosciuti come date o orari. Per informazioni sull'utilizzo delle funzioni CAST e CONVERT con i dati relativi a data e ora, vedere CAST e CONVERT (Transact-SQL)

Conversione del tipo di dati datetime2 in altri tipi di dati relativi a data e ora

Nella tabella seguente viene descritto il risultato della conversione di un tipo di dati datetime2 in altri tipi di dati relativi a data e ora.

Tipo di dati in cui viene eseguita la conversione

Dettagli relativi alla conversione

date

Il giorno, il mese e l'anno vengono copiati.

Nel codice seguente vengono illustrati i risultati della conversione di un valore datetime2(4) in un valore date.

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1234';
DECLARE @date date = @datetime2;
SELECT @datetime2 AS '@datetime2', @date AS 'date';
--Result
--@datetime2               date
-------------------------- ----------
--2025-12-10 12:32:10.1234 2025-12-10
--
--(1 row(s) affected)

time(n)

L'ora, il minuto, il secondo e i secondi frazionari vengono copiati se la scala è uguale e arrotondati se la scala è differente.

Nel codice seguente vengono illustrati i risultati della conversione di un valore datetime2(4) in un valore time(3).

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1237';
DECLARE @time time(3) = @datetime2;
SELECT @datetime2 AS '@datetime2', @time AS 'time(3)';
--Result
--@datetime2                time(3) 
-------------------------- ------------
--2025-12-10 12:32:10.1234 12:32:10.124
--
--(1 row(s) affected)

datetime

I valori della data e dell'ora vengono copiati. Quando la precisione frazionaria del valore datetime(n) è maggiore di tre cifre, il valore viene troncato.

Nel codice seguente vengono illustrati i risultati della conversione di un valore datetime2 in un valore datetime.

DECLARE @datetime2 datetime2 = '12-10-25 12:32:10.1234567'
DECLARE @datetime datetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime';
--Result
--@datetime2                  @datetime
----------------------------- -----------------------
@datetime2             @datetime
---------------------- -----------------------
2025-12-10 12:32:10.12 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

smalldatetime

La data e le ore vengono copiate. I minuti vengono arrotondati rispetto ai secondi e i secondi vengono impostati su 0.

Nel codice seguente vengono illustrati i risultati della conversione di un valore datetime2 in un valore smalldatetime.

DECLARE @datetime2 datetime2 = '12-10-25 12:32:30.9234567';
DECLARE @smalldatetime smalldatetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime';
--Result
@datetime2             @smalldatetime
---------------------- -----------------------
2025-12-10 12:32:30.92 2025-12-10 12:33:00
(1 row(s) affected)

datetimeoffset(n)

Il valore datetime2(n) viene copiato nel valore datetimeoffset(n). La differenza di fuso orario viene impostata su +00:0. Se la precisione del valore datetime2(n) è maggiore di quella del valore datetimeoffset(n), il primo valore viene arrotondato.

Nel codice seguente vengono illustrati i risultati della conversione di un valore datetime2(5) in un valore datetimeoffset(3).

D DECLARE @datetime2 datetime2(3) = '12-10-25 12:32:10.12999';
DECLARE @datetimeoffset datetimeoffset(2) = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset(2)';
--Result
--@datetime2              @datetimeoffset(2)
------------------------- -----------------------------
2025-12-10 12:32:10.13           2025-12-10 12:32:10.13 +00:00
--
--(1 row(s) affected)

Conversione di valori letterali stringa nel tipo di dati 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 esplicite che non specificano uno stile, dai tipi di data e ora ai valori letterali stringa, saranno 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. Tutte le operazione di assegnazione dai valori letterali di ODBC DATETIME in tipi datetime2 provocheranno una conversione implicita tra datetime e questo tipo in base a quanto definito dalle regole di conversione.

ODBC TIME

Vedere la regola relativa a ODBC DATE.

ODBC DATETIME

Vedere la regola relativa a ODBC DATE.

Solo DATE

Il valore predefinito per la parte di TIME è 00:00:00.

solo TIME

Il valore predefinito per la parte di DATE è 1900-1-1.

solo TIMEZONE

Vengono forniti i valori predefiniti.

DATE + TIME

Semplice

DATE + TIMEZONE

Non consentiti.

TIME + TIMEZONE

Il valore predefinito per la parte di DATE è 1900-1-1. L'input TIMEZONE viene ignorato.

DATE + TIME + TIMEZONE

Verrà utilizzato DATETIME locale.

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';

Set di risultati:

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

Vedere anche

Riferimento

CAST e CONVERT (Transact-SQL)