Condividi tramite


date (Transact-SQL)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL di Azure Synapse Analytics Platform System (PDW) in Microsoft Fabric Warehouse nel database SQL di Microsoft Fabric in Microsoft Fabric

Definisce una data in SQL Server. Il tipo di dati date è stato introdotto in SQL Server 2008 (10.0.x).

Descrizione di date

Proprietà valore
Sintassi DATE
Utilizzo DECLARE @MyDate DATE

CREATE TABLE Table1 (Column1 DATE)
Formato predefinito dei valori letterali stringa

(utilizzato per client legacy)
yyyy-MM-dd

Per altre informazioni, vedere la sezione Compatibilità con le versioni precedenti per i client di livello inferiore.
Intervallo 0001-01-01 through 9999-12-31 (1582-10-15 attraverso 9999-12-31 per Informatica)

Da 1 gennaio 1 d.C. a 31 dicembre 9999 d.C. (da 15 ottobre 1582 d.C. a 31 dicembre 9999 d.C. per Informatica)
Intervalli di elementi yyyy è costituito da quattro cifre da 0001 a 9999 che rappresentano un anno. Informatica limita yyyy l'intervallo 1582 a 9999.

MM è costituito da due cifre da 01 a 12 che rappresentano un mese nell'anno specificato.

dd è costituito da due cifre da 01 a 31, a seconda del mese, che rappresenta un giorno del mese specificato.
Lunghezza in caratteri 10 posizioni
Precisione, scala 10, 0
Dimensioni dello spazio di archiviazione 3 byte, fissa
Struttura di archiviazione un intero a 3 byte archivia la data
Precisione Un giorno
Default value 1900-01-01

Questo valore viene usato per la parte relativa all'orario aggiunta per la conversione implicita da time a datetime2 o datetimeoffset.
Calendario Gregoriano
Precisione in secondi frazionari definita dall'utente No
Considerazione e conservazione delle differenze di fuso orario No
Considerazione dell'ora legale No

Formati di valore letterale stringa supportati per date

Gli elenchi seguenti mostrano i formati di valori letterali stringa validi per il tipo di dati date .

[m]m, dde [yy]yy rappresentano mese, giorno e anno in una stringa con segni di barra (/), trattini () o punti (-.) come separatori.

Sono supportati solo anni a quattro cifre o a due cifre. Utilizzare sempre anni a quattro cifre quando possibile. Per specificare un numero intero da 0001 a 9999 che rappresenta l'anno di cutoff per interpretare gli anni a due cifre come anni a quattro cifre, usare l'opzione di configurazione del server cutoff anno a due cifre.

Per Informatica, yyyy è limitato all'intervallo 1582 di 9999.

Un anno a due cifre con valore minore o uguale alle ultime due cifre dell'anno di cambio data si trova nello stesso secolo dell'anno di cambio data. Un anno a due cifre con valore maggiore delle ultime due cifre dell'anno di cambio data si trova nel secolo precedente a quello dell'anno di cambio data. Ad esempio, se il cutoff dell'anno a due cifre è l'impostazione predefinita 2049, l'anno a due cifre viene interpretato come 2049 e l'anno 49 50 a due cifre viene interpretato come 1950.

L'impostazione corrente della lingua determina il formato di data predefinito. È possibile modificare il formato di data usando le istruzioni SET LANGUAGE e SET DATEFORMAT.

Il ydm formato non è supportato per la data.

Formati letterali stringa per mese-giorno-anno

SET DATEFORMAT mdy;
  • [m]m/dd/[yy]yy
  • [m]m-dd-[yy]yy

Formati letterali stringa per month-year-day

SET DATEFORMAT myd;
  • [m]m/[yy]yy/dd
  • [m]m-[yy]yy-dd
  • [m]m.[yy]yy.dd

Formati letterali stringa per day-month-year

SET DATEFORMAT dmy;
  • dd/[m]m/[yy]yy
  • dd-[m]m-[yy]yy
  • dd.[m]m.[yy]yy

Formati letterali stringa per giorno-anno-mese

SET DATEFORMAT dym;
  • dd/[yy]yy/[m]m
  • dd-[yy]yy-[m]m
  • dd.[yy]yy.[m]m

Formati letterali stringa per year-month-day

SET DATEFORMAT ymd;
  • [yy]yy/[m]m/dd
  • [yy]yy-[m]m-dd
  • [yy]yy-[m]m-dd

Elenco alfabetico dei formati

  • [dd] mon[,] yyyy
  • dd mon[,][yy]yy
  • dd [yy]yy mon
  • [dd] yyyy mon
  • mon [dd][,] yyyy
  • mon dd[,] [yy]
  • mon yyyy [dd]
  • yyyy mon [dd]
  • yyyy [dd] mon

mon rappresenta il nome completo del mese o l'abbreviazione del mese, in base alla lingua corrente. Le virgole sono facoltative e l'uso delle maiuscole è ignorato.

Per evitare ambiguità, esprimere gli anni nel formato a quattro cifre.

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

Elenco di formati ISO 8601

  • yyyy-MM-dd
  • yyyyMMdd

Uguale allo standard SQL. Si tratta dell'unico formato definito come standard internazionale.

Elenco non ripartito di formati

  • [yy]yyMMdd
  • yyyy[MMdd]

I dati relativi all'elemento date possono essere specificati con quattro, sei o otto cifre. Una stringa a sei cifre o a otto cifre viene sempre interpretata come ymd. Il mese e il giorno devono sempre essere rappresentati da due cifre. Una stringa a quattro cifre viene interpretata come l'anno.

Formato data ODBC

  • { d 'yyyy-MM-dd' }

Specifico delle API ODBC

Formato data XML W3C

  • yyyy-MM-ddTZD

Supportato per l'utilizzo di XML/SOAP.

TZD è l'operatore di progettazione del fuso orario (Z o +hh:mm o -hh:mm):

  • hh:mm rappresenta la differenza di fuso orario. hh è di due cifre, compreso tra 0 e 14, che rappresentano il numero di ore nella differenza di fuso orario.

  • mm è di due cifre, compreso tra 0 e 59, che rappresentano il numero di minuti aggiuntivi nell'offset del fuso orario.

  • + (più) o - (meno) è il segno obbligatorio della differenza di fuso orario. Questo simbolo indica che, per ottenere l'ora locale, la differenza di fuso orario viene aggiunta o sottratta dall'ora UTC (Coordinated Universal Time). L'intervallo valido di differenza di fuso orario è compreso tra -14:00 e +14:00.

Conformità agli standard ANSI e ISO 8601

date è conforme alla definizione dello standard ANSI SQL per il calendario gregoriano:

I tipi di dati Datetime consentono l'archiviazione delle date nel formato gregoriano nell'intervallo di date da 0001-01-01 CE a 9999-12-31 CE.

Il formato letterale stringa predefinito, usato per i client di livello inferiore, è conforme al modulo standard SQL definito come yyyy-MM-dd. Questo formato corrisponde alla definizione ISO 8601 per DATE.

Nota

Per Informatica, l'intervallo è limitato a 1582-10-15 (15 ottobre 1582 CE) a 9999-12-31 (31 dicembre 9999 CE).

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 del tipo tra un'istanza di livello principale di SQL Server e i client legacy.

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 oppure SQL_VARCHAR DBTYPE_WSTR oppure DBTYPE_STR Java.sql.String String oppure SqString
date yyyy-MM-dd SQL_WVARCHAR oppure SQL_VARCHAR DBTYPE_WSTR oppure DBTYPE_STR Java.sql.String String oppure SqString
datetime2 yyyy-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHAR oppure SQL_VARCHAR DBTYPE_WSTR oppure DBTYPE_STR Java.sql.String String oppure SqString
datetimeoffset yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+ or -]hh:mm SQL_WVARCHAR oppure SQL_VARCHAR DBTYPE_WSTR oppure DBTYPE_STR Java.sql.String String oppure SqString

Convertire i dati di data e ora

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

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

Quando la conversione è in time(n), la conversione non riesce e viene generato il messaggio di errore 206:

Conflitto di tipo operando: la data non è compatibile con l'ora.

Se la conversione è in datetime, il componente date viene copiato. Il codice seguente mostra i risultati della conversione di un valore date in un valore datetime .

DECLARE @date AS DATE = '12-10-25';

DECLARE @datetime AS DATETIME = @date;

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

Il set di risultati è il seguente.

@date      @datetime
---------- -----------------------
2025-12-10 2025-12-10 00:00:00.000

Quando la conversione è in smalldatetime, il valore di date si trova nell'intervallo di un valore smalldatetime, il componente date viene copiato e il componente time viene impostato su 00:00:00.000. Quando il valore di data non rientra nell'intervallo di un valore smalldatetime , viene generato il messaggio di errore 242 e il valore smalldatetime è impostato su NULL:

La conversione di un tipo di dati date in tipi di dati smalldatetime ha generato un valore non compreso nell'intervallo.

Il codice seguente mostra i risultati della conversione di un valore date in un valore smalldatetime .

DECLARE @date AS DATE = '1912-10-25';

DECLARE @smalldatetime AS SMALLDATETIME = @date;

SELECT @date AS '@date',
       @smalldatetime AS '@smalldatetime';

Il set di risultati è il seguente.

@date      @smalldatetime
---------- -------------------
1912-10-25 1912-10-25 00:00:00

Per la conversione in datetimeoffset(n), la data viene copiata e l'ora è impostata su 00:00.0000000 +00:00. Il codice seguente mostra i risultati della conversione di un valore di data in un valore datetimeoffset(3).

DECLARE @date AS DATE = '1912-10-25';

DECLARE @datetimeoffset AS DATETIMEOFFSET (3) = @date;

SELECT @date AS '@date',
       @datetimeoffset AS '@datetimeoffset';

Il set di risultati è il seguente.

@date      @datetimeoffset
---------- ------------------------------
1912-10-25 1912-10-25 00:00:00.000 +00:00

Quando la conversione è in datetime2(n),il componente date viene copiato e il componente time è impostato su 00:00.000000. Il codice seguente mostra i risultati della conversione di un valore di data in un valore datetime2(3).

DECLARE @date AS DATE = '1912-10-25';

DECLARE @datetime2 AS DATETIME2 (3) = @date;

SELECT @date AS '@date',
       @datetime2 AS '@datetime2(3)';

Il set di risultati è il seguente.

@date      @datetime2(3)
---------- -----------------------
1912-10-25 1912-10-25 00:00:00.000

Convertire i valori letterali stringa in data

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 le conversioni esplicite che non specificano uno stile, dai tipi di data e ora ai valori letterali stringa, sono 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 date.

Valore letterale stringa di input data
ODBC DATE Viene eseguito il mapping dei valori letterali stringa ODBC al tipo di dati datetime. Tutte le operazioni di assegnazione dai valori letterali di ODBC DATETIME in tipi di dati date determinano una conversione implicita tra datetime e il tipo 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 Semplice
solo TIME Vengono forniti i valori predefiniti.
solo TIMEZONE Vengono forniti i valori predefiniti.
DATE + TIME Viene utilizzata la parte di DATE della stringa di input.
DATE + TIMEZONE Non consentiti.
TIME + TIMEZONE Vengono forniti i valori predefiniti.
DATE + TIME + TIMEZONE Viene utilizzata la parte DATE di DATETIME locale.

Esempi

Nell'esempio seguente vengono confrontati i risultati dell'esecuzione del cast di una stringa ai tipi di dati relativi a data e ora.

SELECT CAST ('2022-05-08 12:35:29.1234567 +12:15' AS TIME (7)) AS 'time',
       CAST ('2022-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
       CAST ('2022-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
       CAST ('2022-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
       CAST ('2022-05-08 12:35:29.1234567 +12:15' AS DATETIME2 (7)) AS 'datetime2',
       CAST ('2022-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 2022-05-08
smalldatetime 2022-05-08 12:35:00
datetime 2022-05-08 12:35:29.123
datetime2 2022-05-08 12:35:29.1234567
datetimeoffset 2022-05-08 12:35:29.1234567 +12:15