datetimeoffset (Transact-SQL)

Si applica a:yes SQL Server (tutte le versioni supportate) Database SQL di YesAzure Istanza yesgestita di SQL di Azure Azure Synapse Analytics Platform yesSystem (PDW) Yes

Definisce una data combinata con un'ora di un giorno in base a un orologio di 24 ore, ad esempio datetime2, e aggiunge la consapevolezza del fuso orario in base all'ora UTC (Coordinata orario universale o Ora media di Greenwich).

Descrizione di datetimeoffset

Proprietà valore
Sintassi datetimeoffset [ (precisione in secondi frazionari) ]
Uso DICHIARAre @MyDatetimeoffset datetimeoffset(7)

CREATE TABLE Table1 ( Column1 datetimeoffset(7) )
Formati predefiniti per i valori letterali stringa (utilizzati per il client legacy) AAAA-MM-GG hh:mm:ss[.nnnnnnn] [{+|-}hh:mm]

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

Dal 1 gennaio 1 al 31 dicembre 9999
Intervallo di ore da 00:00:00 a 23:59:59.9999999
Intervallo di differenze di fuso orario Da -14:00 a +14:00
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 un numero di cifre da 0 a 7 e compreso tra 0 e 9999999, indicante i secondi frazionari.

hh rappresenta un numero di due cifre compreso tra -14 e +14.

mm rappresenta un numero di due cifre compreso tra 00 e 59.
Lunghezza in caratteri Da un minimo di 26 posizioni (AAAA-MM-GG hh:mm:ss {+|-}hh:mm) a un massimo di 34 (AAAA-MM-GG hh:mm:ss.nnnnnnn {+|-}hh:mm)
Precisione, scala Vedere la tabella riportata di seguito.
Dimensioni dello spazio di archiviazione 10 byte, fissa è l'impostazione predefinita con l'impostazione predefinita di 100 ns di precisione in secondi frazionari.
Accuratezza 100 nanosecondi
Valore predefinito 1900-01-01 00:00:00 00:00
Calendario Gregoriano
Precisione in secondi frazionari definita dall'utente
Considerazione e conservazione delle differenze di fuso orario
Considerazione dell'ora legale No
Scala specificata Risultato (precisione, scala) Lunghezza della colonna (byte) Precisione in secondi frazionari
datetimeoffset (34,7) 10 7
datetimeoffset(0) (26,0) 8 0-2
datetimeoffset(1) (28,1) 8 0-2
datetimeoffset(2) (29,2) 8 0-2
datetimeoffset(3) (30,3) 9 3-4
datetimeoffset(4) (31,4) 9 3-4
datetimeoffset(5) (32,5) 10 5-7
datetimeoffset(6) (33,6) 10 5-7
datetimeoffset(7) (34,7) 10 5-7

Formati di valore letterale stringa supportati per datetimeoffset

Nella tabella seguente vengono elencati i formati di valore letterale stringa ISO 8601 supportati per datetimeoffset. Per informazioni sui formati alfabetici, numerici, nonparati e temporali per le parti date e ora di datetimeoffset, vedere data (Transact-SQL) e ora (Transact-SQL).

ISO 8601 Descrizione
YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm] Su questi due formati non influiscono le impostazioni locali delle sessioni SET LANGUAGE e SET DATEFORMAT. Non sono consentiti spazi tra le parti datetimeoffset e datetime.
AAAA-MM-GGThh:mm:ss[.nnnnnnn]Z (UTC) In base alla definizione ISO questo formato indica che la parte datetime deve essere espressa in formato UTC (Coordinated Universal Time). Ad esempio, 1999-12-12 12:30:30.12345 -07: 00 deve essere rappresentata come 1999-12-12 19:30:30.12345Z.

Differenza di fuso orario

Una differenza di fuso orario specifica la differenza di fuso orario rispetto all'ora UTC per un valore time o datetime. La differenza di fuso orario può essere rappresentata nel formato [+|-] hh:mm:

  • hh è un numero di due cifre, compreso tra 00 e 14, che rappresenta il numero di ore della differenza di fuso orario.
  • mm è un numero di due cifre, compreso tra 00 e 59, che rappresenta il numero di minuti aggiuntivi della differenza di fuso orario.
  • + (più) o - (meno) è il segno obbligatorio per un offset del fuso orario. Indica se la differenza di fuso orario viene aggiunta o sottratta dall'ora UTC per ottenere l'ora locale. L'intervallo valido della differenza di fuso orario è da -14:00 a +14:00.

L'intervallo di differenza di fuso orario segue lo standard XML W3C per la definizione di schemi XSD, leggermente diverso dalla definizione standard di SQL 2003, da 12:59 a +14:00.

Il parametro facoltativo di tipo precisione in secondi frazionari specifica il numero di cifre per la parte relativa ai secondi frazionari. Questo valore può essere un numero intero con un numero di cifre compreso tra 0 e 7 (100 nanosecondi). Il valore predefinito della precisione in secondi frazionari è 100 ns (sette cifre per la parte relativa ai secondi frazionari).

I dati sono archiviati nel database ed elaborati, confrontati, ordinati e indicizzati nel server come in UTC. La differenza di fuso orario viene mantenuta nel database per il recupero.

La differenza di fuso orario specificata deve essere sensibile all'ora legale e regolata sui valori di datetime appartenenti al periodo in cui è in vigore l'ora legale.

Per il tipo datetimeoffset, i valori datetime UTC e locali (per la differenza di fuso orario persistente o convertita), vengono convalidati durante le operazioni aritmetiche e di inserimento, aggiornamento, conversione o assegnazione. Il rilevamento di qualsiasi valore datetime UTC o locale (per la differenza di fuso orario persistente o convertita) non valido genera un errore. Ad esempio, 9999-12-31 10:10:00 è valido in UTC ma causa overflow nell'ora locale per la differenza di fuso orario +13:50.

Per convertire una data in un valore datetimeoffset corrispondente in un fuso orario di destinazione, vedere AT TIME ZONE (Transact-SQL).

Conformità agli standard ANSI e ISO 8601

Le sezioni sulla conformità agli standard ANSI e ISO 8601 degli argomenti date e time si applicano a datetimeoffset.

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 dei tipi tra un'istanza di livello superiore di SQL Server e client a livello inferiore.

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

Conversione dei dati relativi a data e ora

Quando si esegue la conversione in tipi di dati data e ora, SQL Server 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 (Transact-SQL)

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

Questa sezione descrive il risultato della conversione di un tipo di dati datetimeoffset in altri tipi di dati relativi a data e ora.

Quando si converte in data, l'anno, il mese e il giorno vengono copiati. Nel codice seguente vengono illustrati i risultati della conversione di un valore datetimeoffset(4) in un valore date.

DECLARE @datetimeoffset datetimeoffset(4) = '12-10-25 12:32:10 +01:00';  
DECLARE @date date= @datetimeoffset;  
  
SELECT @datetimeoffset AS '@datetimeoffset ', @date AS 'date';  
  
--Result  
--@datetimeoffset                date  
-------------------------------- ----------  
--2025-12-10 12:32:10.0000 +01:0 2025-12-10  
--  
--(1 row(s) affected)  
  

Se viene eseguita la conversione in time(n), vengono copiati ora, minuti, secondi e secondi frazionari. Il valore del fuso orario viene troncato. Quando la precisione del valore datetimeoffset(n) è maggiore di quella del valore time(n), la prima precisione viene arrotondata. Nel codice seguente vengono illustrati i risultati della conversione di un valore datetimeoffset(4) in un valore time(3).

DECLARE @datetimeoffset datetimeoffset(4) = '12-10-25 12:32:10.1237 +01:0';  
DECLARE @time time(3) = @datetimeoffset;  
  
SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time';  
  
--Result  
--@datetimeoffset                time  
-------------------------------- ------------  
-- 2025-12-10 12:32:10.1237 +01:00    12:32:10.124  
  
--  
--(1 row(s) affected)  
  

Quando viene eseguita la conversione in datetime, i valori della data e dell'ora vengono copiati, mentre il fuso orario viene troncato. Quando la precisione frazionaria del valore datetimeoffset(n) è maggiore di tre cifre, il valore viene troncato. Nel codice seguente vengono illustrati i risultati della conversione di un valore datetimeoffset(4) in un valore datetime.

DECLARE @datetimeoffset datetimeoffset(4) = '12-10-25 12:32:10.1237 +01:0';  
DECLARE @datetime datetime = @datetimeoffset;  
  
SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime';  
  
--Result  
--@datetimeoffset                datetime  
-------------------------------- -----------------------  
--2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123  
--  
--(1 row(s) affected)  

Per le conversioni in smalldatetime, vengono copiate le date e le ore. i minuti vengono arrotondati rispetto al valore dei secondi e i secondi vengono impostati su 0. Nel codice seguente vengono illustrati i risultati della conversione di un valore datetimeoffset(3) in un valore smalldatetime.

DECLARE @datetimeoffset datetimeoffset(3) = '1912-10-25 12:24:32 +10:0';  
DECLARE @smalldatetime smalldatetime = @datetimeoffset;  
  
SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime';  
  
--Result  
--@datetimeoffset                @smalldatetime  
-------------------------------- -----------------------  
--1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00  
--  
--(1 row(s) affected)  

Se la conversione viene eseguita in datetime2(n), data e ora vengono copiate nel valore datetime2 e il fuso orario viene troncato. Se la precisione del valore datetime2(n) è maggiore di quella del valore datetimeoffset(n), i secondi frazionari vengono troncati. Nel codice seguente vengono illustrati i risultati della conversione di un valore datetimeoffset(4) in un valore datetime2(3).

DECLARE @datetimeoffset datetimeoffset(4) = '1912-10-25 12:24:32.1277 +10:0';  
DECLARE @datetime2 datetime2(3)=@datetimeoffset;  
  
SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2';  
  
--Result  
@datetimeoffset                    @datetime2  
---------------------------------- ----------------------  
1912-10-25 12:24:32.1277 +10:00    1912-10-25 12:24:32.12  
  
--(1 row(s) affected)  

Conversione di valori letterali stringa nel tipo di dati datetimeoffset

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

Valore letterale stringa di input datetimeoffset(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 datetimeoffset determineranno 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. Il valore predefinito di TIMEZONE è +00:00:00.
solo TIME Il valore predefinito per la parte di DATE è 1900-1-1. Il valore predefinito di TIMEZONE è +00:00.
solo TIMEZONE Vengono forniti i valori predefiniti.
DATE + TIME Il valore predefinito di TIMEZONE è +00:00:00.
DATE + TIMEZONE Non consentito
TIME + TIMEZONE Il valore predefinito per la parte di DATE è 1900-1-1.
DATE + TIME + TIMEZONE Semplice

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'  
    ,CAST('2007-05-08 12:35:29.1234567+12:15' AS datetimeoffset(7)) AS  
        'datetimeoffset IS08601';  

Questo è il set di risultati.

Tipo di dati Output
Time 12:35:29. 1234567
Data 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

CAST e CONVERT (Transact-SQL)
AT TIME ZONE (Transact-SQL)