Condividi tramite


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, .003o .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, Aprilo 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, usare N''.

  • 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 come 2025 e 50 viene interpretato come 1950. 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 Ti 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, .003o .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