datetime (Transact-SQL)
si applica a:SQL Server
database SQL di Azure
Istanza gestita di SQL di Azure
Azure Synapse Analytics
Analytics Platform System (PDW)
database SQL in Microsoft Fabric
Definisce una data costituita dalla combinazione di un'ora del giorno e di secondi frazionari ed espressa nel formato 24 ore.
Evitare di usare datetime per il nuovo lavoro. Usare invece i tipi di dati time, date, datetime2 e datetimeoffset . Questi tipi sono allineati allo standard SQL e sono più portabili. 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 |
Utilizzo | DECLARE @MyDatetime DATETIME; CREATE TABLE Table1 (Column1 DATETIME); |
Formati di valori letterali stringa predefiniti (usati per il client di livello inferiore) | Non applicabile |
Intervallo di date | 1753-01-01 (1 gennaio 1753) fino al 9999-12-31 (31 dicembre 9999) |
Intervallo di tempo | da 00:00:00 a 23:59:59.997 |
Intervallo di offset del fuso orario | None |
Intervalli di elementi |
yyyy è costituito da quattro cifre da 1753 a 9999 che rappresentano un anno.MM è costituito da due cifre, comprese tra 01 e 12 , che rappresentano un mese nell'anno specificato.dd è costituito da due cifre, che vanno da 01 a in base al 31 mese, che rappresentano un giorno del mese specificato.HH è di due cifre, compreso tra 00 e 23 , che rappresentano l'ora.mm è costituito da due cifre, comprese tra 00 e 59 , che rappresentano il minuto.ss è di due cifre, che vanno da 00 a 59 , che rappresentano il secondo.n* è da zero a tre cifre, compreso tra 0 e 999 , che rappresentano i secondi frazionari. |
Lunghezza carattere | Da 19 posizioni minimo a 23 massimo |
Dimensioni archiviazione | 8 byte |
Precisione | Arrotondato agli incrementi di .000 , .003 o .007 secondi |
Valore predefinito | 1900-01-01 00:00:00 |
Calendario | Gregoriano (include la gamma completa di anni) |
Precisione frazionaria definita dall'utente | No |
Riconoscimento e conservazione della differenza di fuso orario | No |
Riconoscimento dell'ora legale | No |
Formati di valore letterale stringa supportati per datetime
Nelle tabelle seguenti sono elencati i formati di valore letterale stringa supportati per datetime. Ad eccezione di ODBC, i valori letterali stringa datetime si trovano tra virgolette singole ('
), ad esempio 'string_literaL'
. Se l'ambiente non us_english
è , i valori letterali stringa devono essere in formato N'string_literaL'
Unicode.
Formato numerico
È possibile specificare i dati relativi alla data specificando il mese in formato numerico. Ad esempio, 5/20/97
rappresenta il ventesimo giorno del maggio 1997. Quando si utilizza il formato di data numerico, specificare il mese, il giorno e l'anno in una stringa che utilizza segni barra (/
), trattini (-
) o punti (.
) come separatori. Il formato corretto è il seguente:
<number separator number separator number [time] [time]>
Quando la lingua è impostata su us_english
, l'ordine predefinito per la data è mdy
(mese, giorno, anno). È possibile modificare il formato di data mediante l'istruzione SET DATEFORMAT.
L'impostazione per 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 ordinate potrebbero essere interpretate erroneamente come fuori intervallo o con valori errati. Ad esempio, 12/10/08
può essere interpretato come una delle sei date, a seconda dell'impostazione DATEFORMAT
. Un anno in quattro parti è interpretato come anno.
Formato data | Ordinamento |
---|---|
[0]4/15/[19]96 |
mdy |
[0]4-15-[19]96 |
mdy |
[0]4.15.[19]96 |
mdy |
[0]4/[19]96/15 |
myd |
15/[0]4/[19]96 |
dmy |
15/[19]96/[0]4 |
dym |
[19]96/15/[0]4 |
ydm |
[19]96/[0]4/15 |
ymd |
Formato ora |
---|
14:30 |
14:30[:20:997] |
14:30[:20.9] |
4am |
4 PM |
Formato alfabetico
È possibile specificare dati relativi alla data con il mese specificato con il nome completo. Ad esempio, April
o l'abbreviazione del mese di Apr
, specificata nella lingua 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:
Racchiudere i dati di data e ora tra virgolette singole (
'
). Per le lingue diverse dall'inglese, usareN''
.I caratteri racchiusi tra parentesi quadre sono facoltativi.
Se si specificano solo le ultime due cifre dell'anno, i valori minori delle ultime due cifre del valore dell'opzione di configurazione cutoff dell'anno a due cifre si trovano nello stesso secolo dell'anno di riduzione. I valori maggiori o uguali al valore di questa opzione vengono interpretati come appartenenti al secolo che precede l'anno di cambio data. Ad esempio, se il cutoff dell'anno a due cifre è
2050
(impostazione predefinita),25
viene interpretato come2025
e50
viene interpretato come1950
. Per evitare ambiguità, esprimere gli anni nel formato a quattro cifre.Se manca il giorno, viene inserito il primo giorno del mese.
L'impostazione
SET DATEFORMAT
della sessione non viene applicata quando si specifica il mese in formato alfabetico.
Espressione alfabetica |
---|
Apr[il] [15][,] 1996 |
Apr[il] 15[,] [19]96 |
Apr[il] 1996 [15] |
[15] Apr[il][,] 1996 |
15 Apr[il][,][19]96 |
15 [19]96 apr[il] |
[15] 1996 apr[il] |
1996 APR[IL] [15] |
1996 [15] APR[IL] |
Formato ISO 8601
Per usare il formato ISO 8601, è necessario specificare ogni elemento nel formato, inclusi T
i due punti () e il punto (:
.
) visualizzati nel formato .
Le parentesi indicano che la frazione del componente dei secondi è facoltativa. Il componente dell'ora viene specificato nel formato 24 ore. Indica T
l'inizio della parte dell'ora del valore datetime .
Il vantaggio dell'uso del formato ISO 8601 è che si tratta di uno standard internazionale con specifiche non ambigue. Inoltre, questo formato non è interessato dall'impostazione SET DATEFORMAT
o SET LANGUAGE .
Esempi:
2004-05-23T14:25:10
2004-05-23T14:25:10.487
ISO 8601 |
---|
yyyy-MM-ddTHH:mm:ss[.mmm] |
yyyyMMdd[ HH:mm:ss[.mmm]] |
Formato non ripartito
Questo formato è simile al formato ISO 8601, ad eccezione del fatto che non contiene separatori di data.
Senza separatori |
---|
yyyyMMdd HH:mm:ss[.mmm] |
Formato ODBC
L'API ODBC definisce sequenze di escape per la rappresentazione dei valori di data e ora, che in ODBC sono denominati dati timestamp. Il formato timestamp di 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.
Le sequenze di escape del timestamp ODBC sono del formato : { <literal_type> '<constant_value>' }
<literal_type>
specifica il tipo della sequenza di escape. I timestamp hanno tre<literal_type>
identificatori:-
d
= solo data -
t
= solo ora -
ts
= timestamp (time + date)
-
<constant_value>
è il valore della sequenza di escape.<constant_value>
deve seguire questi formati per ogni<literal_type>
:-
d
:yyyy-MM-dd
-
t
:hh:mm:ss[.fff]
-
ts
:yyyy-MM-dd HH:mm:ss[.fff]
-
ODBC |
---|
{ ts '1998-05-02 01:23:56.123' } |
{ d '1990-10-02' } |
{ t '13:33:41' } |
Arrotondamento della precisione in secondi frazionari dei valori datetime
I valori datetime vengono arrotondati agli incrementi di .000
, .003
o .007
secondi, come illustrato nell'esempio seguente.
SELECT '01/01/2024 23:59:59.999' AS [User-specified value],
CAST('01/01/2024 23:59:59.999' AS DATETIME) AS [System stored value]
UNION SELECT '01/01/2024 23:59:59.998', CAST('01/01/2024 23:59:59.998' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.997', CAST('01/01/2024 23:59:59.997' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.996', CAST('01/01/2024 23:59:59.996' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.995', CAST('01/01/2024 23:59:59.995' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.994', CAST('01/01/2024 23:59:59.994' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.993', CAST('01/01/2024 23:59:59.993' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.992', CAST('01/01/2024 23:59:59.992' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.991', CAST('01/01/2024 23:59:59.991' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.990', CAST('01/01/2024 23:59:59.990' AS DATETIME);
Il set di risultati è il seguente.
Valore specificato dall'utente | Valore archiviato dal sistema |
---|---|
01/01/2024 23:59:59.999 |
2024-01-02 00:00:00.000 |
01/01/2024 23:59:59.998 01/01/2024 23:59:59.997 01/01/2024 23:59:59.996 01/01/2024 23:59:59.995 |
2024-01-01 23:59:59.997 |
01/01/2024 23:59:59.994 01/01/2024 23:59:59.993 01/01/2024 23:59:59.992 |
2024-01-01 23:59:59.993 |
01/01/2024 23:59:59.991 01/01/2024 23:59:59.990 |
2024-01-01 23:59:59.990 |
Conformità agli standard ANSI e ISO 8601
datetime non è conforme agli standard ANSI e ISO 8601.
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 CAST
funzioni e CONVERT
con i dati di data e ora, vedere CAST e CONVERT.
Convertire 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 ora è 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';
Il set di risultati è il seguente.
@datetime @date
------------------------ -----------
2016-12-21 00:00:00.000 2016-12-21
L'esempio precedente usa un formato di data specifico dell'area (MM-DD-YY
).
DECLARE @date DATE = '12-21-16';
È consigliabile 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 (yyyy-MM-dd
). Ad esempio:
DECLARE @date DATE = '2016-12-21';
DECLARE @datetime DATETIME = @date;
SELECT @datetime AS '@datetime', @date AS '@date';
Quando la conversione viene eseguita da time(n), il componente ora viene copiato e il componente data è impostato su 1900-01-01
. Quando la precisione frazionaria del valore time(n) è maggiore di tre cifre, il valore viene troncato per adattarsi. 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';
Il set di risultati è il seguente.
@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, 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';
Il set di risultati è il seguente.
@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';
Il set di risultati è il seguente.
@datetime @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237 +10:0
Quando la conversione è 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';
Il set di risultati è il seguente.
@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('2024-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
CAST('2024-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
CAST('2024-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
CAST('2024-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 |
2024-05-08 |
smalldatetime |
2024-05-08 12:35:00 |
datetime |
2024-05-08 12:35:29.123 |
datetime2 |
2024-05-08 12:35:29.1234567 |
datetimeoffset |
2024-05-08 12:35:29.1234567 +12:15 |