datetime (Transact-SQL)
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)
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 datat
= solo orats
= 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 |