datetime (Transact-SQL)

Si applica a:yes SQL Server (tutte le versioni supportate) Yesdatabase SQL di Azure YesIstanza gestita di SQL di Azure yesAzure Synapse Analytics Analytics yesPlatform System (PDW)

Definisce una data costituita dalla combinazione di un'ora del giorno e di secondi frazionari ed espressa nel formato 24 ore.

Nota

Usare i tipi di dati time, date, datetime2 e datetimeoffset per la creazione di nuovo codice. Questi tipi sono conformi allo standard SQL. e offrono una migliore portabilità. time, datetime2 e datetimeoffset offrono una maggiore precisione dei secondi. datetimeoffset offre il supporto del fuso orario per le applicazioni distribuite globalmente.

Descrizione

Proprietà valore
Sintassi datetime
Uso DECLARE @MyDatetime datetime

CREATE TABLE Table1 ( Column1 datetime )
Formati predefiniti dei valori letterali stringa

(utilizzato per client legacy)
Non applicabile
Intervallo di date Da 01.01.53 a 31.12.99
Intervallo di ore da 00:00:00 a 23:59:59.997
Intervallo di differenze di fuso orario nessuno
Intervalli di elementi AAAA rappresenta un numero di quattro cifre compreso tra 1753 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 3 e compreso tra 0 e 999, indicante i secondi frazionari.
Lunghezza in caratteri Da 19 posizioni minimo a 23 massimo
Dimensioni dello spazio di archiviazione 8 byte
Accuratezza Arrotondato a incrementi di 0,000, 0,003 o 0,007 secondi
Valore predefinito 1900-01-01 00:00:00
Calendario Gregoriano (non include l'intervallo completo di anni)
Precisione in secondi frazionari definita dall'utente No
Considerazione e conservazione delle differenze di fuso orario No
Considerazione dell'ora legale No

Formati di valori letterali stringa supportati per datetime

Nelle tabelle seguenti sono elencati i formati di valore letterale stringa supportati per datetime. Fatta eccezione per ODBC, i valori letterali stringa datetime sono compresi tra virgolette singole ('), ad esempio, 'string_literaL'. Se l'ambiente è diverso da us_english, i valori letterali stringa devono essere nel formato N'string_literaL'.

Numeric Descrizione
Formati di data:

[0]4/15/[19]96 -- (mga)

[0]4-15-[19]96 -- (mga)

[0]4.15.[19]96 -- (mga)

[0]4/[19]96/15 -- (mag)

15/[0]4/[19]96 -- (gma)

15/[19]96/[0]4 -- (gam)

[19]96/15/[0]4 -- (agm)

[19]96/[0]4/15 -- (amg)

Formati di ora:

14:30

14:30[:20:999]

14:30[:20.9]

4am

4 PM
È possibile specificare i dati relativi alla data specificando il mese in formato numerico. Ad esempio, 5/20/97 rappresenta il ventesimo giorno di maggio 1997. Quando si utilizza il formato di data numerico, specificare il mese, il giorno e l'anno all'interno della stessa stringa utilizzando come separatori la barra (/), il segno meno (-) o il punto (.). Il formato corretto è il seguente:

numero separatore numero separatore numero[ora] [ora]



Quando l'impostazione della lingua è us_english, l'ordine predefinito di visualizzazione della data è mga. È possibile modificare il formato di data mediante l'istruzione SET DATEFORMAT.

L'impostazione dell'istruzione SET DATEFORMAT determina la modalità di interpretazione dei valori di data. Se l'ordine non corrisponde all'impostazione, i valori non vengono interpretati come date. Le date non in ordine potrebbero essere erroneamente interpretate come fuori intervallo o con valori errati. La data 12/10/08 può ad esempio essere interpretata in sei modi diversi a seconda dell'impostazione di DATEFORMAT. Un anno in quattro parti è interpretato come anno.
Espressione alfabetica Descrizione
Apr[ile] [15][,] 1996

Apr[ile] 15[,] [19]96

Apr[ile] 1996 [15]

[15] Apr[ile][,] 1996

15 Apr[ile][,][19]96

15 [19]96 apr[ile]

[15] 1996 apr[ile]

1996 APR[ILE] [15]

1996 [15] APR[ILE]
È possibile specificare dati relativi alla data con il mese specificato con il nome completo. Ad esempio, aprile o l'abbreviazione del mese di aprile specificata nel linguaggio corrente. Le virgole sono facoltative e l'uso delle maiuscole è ignorato.

Di seguito vengono riportate alcune linee guida per l'utilizzo dei formati di data alfabetici:

1) Racchiudere data e ora tra virgolette singole ('). Per le lingue diverse dall'inglese, utilizzare N'

2) I caratteri inclusi tra parentesi sono facoltativi.

3) Se si specificano solo le ultime due cifre dell'anno, i valori minori delle ultime due cifre del valore impostato nell'opzione di configurazione Cambio data per anno a due cifre vengono interpretati come appartenenti allo stesso secolo dell'anno di cambio data. I valori maggiori o uguali al valore di questa opzione vengono interpretati come appartenenti al secolo che precede l'anno di cambio data. Se ad esempio il valore di Cambio data per anno a due cifre è 2050 (impostazione predefinita), 25 viene interpretato come 2025 mentre 50 viene interpretato come 1950. Per evitare ambiguità, esprimere gli anni nel formato a quattro cifre.

4) Se manca il giorno, viene inserito il primo giorno del mese.



Quando si specifica il mese in formato alfabetico, l'impostazione di SET DATEFORMAT della sessione non viene applicata.
ISO 8601 Descrizione
AAAA-MM-GGThh:mm:ss [.mmm]

AAAAMMGG[ hh:mm:ss[.mmm]]
Esempi:

1) 2004-05-23T14:25:10

2) 2004-05-23T14:25:10.487



Per usare il formato ISO 8601 è necessario specificare ogni elemento in tale formato, includendo il carattere T, i due punti (:) e il punto (.) in esso presenti.

Le parentesi indicano che la frazione del componente dei secondi è facoltativa. Il componente dell'ora viene specificato nel formato 24 ore.

Il carattere T indica l'inizio della parte dell'ora del valore datetime.

Il vantaggio dell'utilizzo del formato ISO 8601 consiste nel fatto che è uno standard internazionale con specifiche chiare. L'impostazione di SET DATEFORMAT o SET LANGUAGE non influisce su questo formato.
Senza separatori Descrizione
AAAAMMGG hh:mm:ss[.mmm]
ODBC Descrizione
{ ts '1998-05-02 01:23:56.123' }

{ d '1990-10-02' }

{ t '13:33:41' }
L'API ODBC definisce sequenze di escape per la rappresentazione dei valori di data e ora, che in ODBC sono denominati dati timestamp. Questo formato timestamp ODBC è supportato anche dalla definizione del linguaggio OLE DB (DBGUID-SQL) supportata dal provider Microsoft OLE DB per SQL Server. Nelle applicazioni che utilizzano API basate su ADO, OLE DB e ODBC è possibile utilizzare il formato timestamp ODBC per la rappresentazione di valori di data e ora.

Il formato delle sequenze di escape del timestamp ODBC è il seguente: { literal_type 'constant_value' }:



- literal_type specifica il tipo di sequenza di escape. I timestamp sono caratterizzati da tre identificatori di tipo literal_type:
1) d = solo data
2) t = solo ora
3) ts = timestamp (ora + data)



- "constant_value" rappresenta il valore della sequenza di escape. constant_value deve seguire questi formati per ogni elemento literal_type:.
d : yyyy-mm-dd
t : hh:mm:ss[.fff]
ts : yyyy-mm-dd hh:mm:ss[.fff]

Arrotondamento della precisione di secondo frazionario datetime

I valori datetime vengono arrotondati con incrementi di 0,000, 0,003 o 0,007 secondi, come illustrato nella tabella seguente.

Valore specificato dall'utente Valore archiviato dal sistema
01/01/98 23:59:59.999 1998-01-02 00:00:00.000
01/01/98 23:59:59.995

01/01/98 23:59:59.996

01/01/98 23:59:59.997

01/01/98 23:59:59.998
1998-01-01 23:59:59.997
01/01/98 23:59:59.992

01/01/98 23:59:59.993

01/01/98 23:59:59.994
1998-01-01 23:59:59.993
01/01/98 23:59:59.990

01/01/98 23:59:59.991
1998-01-01 23:59:59.990

Conformità agli standard ANSI e ISO 8601

datetime non è conforme agli standard ANSI e ISO 8601.

Conversione dei dati relativi a data e ora

Quando si esegue la conversione in tipi di dati di data e ora, SQL Server rifiuta tutti i valori non riconosciuti 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 di altri tipi di data e ora nel tipo di dati datetime

Nella sezione seguente viene descritto il risultato della conversione di altri tipi di dati di data e ora nel tipo di dati datetime.

Quando viene eseguita la conversione da date, vengono copiati anno, mese e giorno. Il componente relativo all'ora viene impostato su 00:00:00.000. Nel codice seguente vengono illustrati i risultati della conversione di un valore date in un valore datetime.

DECLARE @date date = '12-21-16';  
DECLARE @datetime datetime = @date;  
  
SELECT @datetime AS '@datetime', @date AS '@date';  
  
--Result  
--@datetime               @date  
------------------------- ----------  
--2016-12-21 00:00:00.000 2016-12-21  

Nota

L'esempio precedente usa un formato di data specifico dell'area (MM-GG-YY).

DECLARE @date date = '12-21-16';

È possibile aggiornare l'esempio in modo che corrisponda al formato per l'area.

È anche possibile completare l'esempio con il formato di data conforme ISO 8601 (AAAA-MM-GG). Ad esempio:

DECLARE @date date = '2016-12-21';  
DECLARE @datetime datetime = @date;  

SELECT @datetime AS '@datetime', @date AS '@date';  

Quando la conversione è da time(n), il componente relativo all'ora viene copiato e quello relativo alla data viene impostato su "1900-01-01". Quando la precisione frazionaria del valore time(n) è maggiore di tre cifre, il valore verrà troncato. Nell'esempio seguente vengono illustrati i risultati della conversione di un valore time(4) in un valore datetime.

DECLARE @time time(4) = '12:10:05.1237';  
DECLARE @datetime datetime = @time;  
  
SELECT @datetime AS '@datetime', @time AS '@time';  
  
--Result  
--@datetime               @time  
------------------------- -------------  
--1900-01-01 12:10:05.123 12:10:05.1237  

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

DECLARE @smalldatetime smalldatetime = '12-01-16 12:32';  
DECLARE @datetime datetime = @smalldatetime;  
  
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';  
  
--Result  
--@datetime               @smalldatetime  
------------------------- -----------------------  
--2016-12-01 12:32:00.000 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. Quando la precisione frazionaria del valore datetimeoffset(n) è maggiore di tre cifre, il valore viene troncato. Nell'esempio seguente vengono illustrati i risultati della conversione di un valore datetimeoffset(4) in un valore datetime.

DECLARE @datetimeoffset datetimeoffset(4) = '1968-10-23 12:45:37.1234 +10:0';  
DECLARE @datetime datetime = @datetimeoffset;  
  
SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';  
  
--Result  
--@datetime               @datetimeoffset  
------------------------- ------------------------------  
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237 +10:0   

Quando la conversione viene eseguita da datetime2(n), la data e l'ora vengono copiate. Quando la precisione frazionaria del valore datetime2(n) è maggiore di tre cifre, il valore viene troncato. Nell'esempio seguente vengono illustrati i risultati della conversione di un valore datetime2(4) in un valore datetime.

DECLARE @datetime2 datetime2(4) = '1968-10-23 12:45:37.1237';  
DECLARE @datetime datetime = @datetime2;  
  
SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';  
  
--Result  
--@datetime               @datetime2  
------------------------- ------------------------  
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237  

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

Questo è il 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

CAST e CONVERT (Transact-SQL)