date (Transact-SQL)
Si applica a: SQL Server Azure SQL Database
Istanza gestita di SQL di Azure Azure Synapse
Analytics Analytics
Platform System (PDW)
SQL Endpoint in Microsoft Fabric Warehouse in Microsoft Fabric
Definisce una data in SQL Server.
Descrizione di date
Proprietà | valore |
---|---|
Sintassi | date |
Uso | DECLARE @MyDate date CREATE TABLE Table1 ( Column1 date ) |
Formato predefinito dei valori letterali stringa (utilizzato per client legacy) |
YYYY-MM-DD Per ulteriori informazioni, vedere la sezione seguente relativa alla compatibilità con le versioni precedenti per i client legacy. |
Range | da 0001-01-01 a 9999-12-31 (da 1582-10-15 a 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 | AAAA rappresenta un numero di quattro cifre compreso tra 0001 e 9999 indicante l'anno. Per Informatica, AAAA è limitato all'intervallo compreso tra 1582 e 9999. 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 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 | Valore intero di 1, 3 byte archivia la data. |
Accuratezza | Un giorno |
Valore predefinito | 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
Nelle tabelle seguenti sono illustrati i formati di valore letterale stringa supportati per il tipo di dati date.
Numeric | Descrizione |
---|---|
mdy [m]m/dd/[yy]yy [m]m-dd-[yy]yy [m]m.dd.[yy]yy myd mm/[yy]yy/dd mm-[yy]yy/dd [m]m.[yy]yy.dd dmy dd/[m]m/[yy]yy dd-[m]m-[yy]yy dd.[m]m.[yy]yy dym dd/[yy]yy/[m]m dd-[yy]yy-[m]m dd.[yy]yy.[m]m ymd [yy]yy/[m]m/dd [yy]yy-[m]m-dd [yy]yy-[m]m-dd |
[m]m, gg e [aa]aa rappresentano il mese, il giorno e l'anno all'interno di una stringa in cui sono usati come separatori la barra (/), il segno meno (-) o il punto (.). Sono supportati solo anni a due cifre o a quattro cifre. Utilizzare sempre anni a quattro cifre quando possibile. Per specificare un valore intero compreso tra 0001 e 9999 che rappresenta l'anno di cambio data per l'interpretazione degli anni a due cifre come anni a quattro cifre, vedere Configurare l'opzione di configurazione del server Cambio data per anno a due cifre. Nota: per Informatica, AAAA è limitato all'intervallo compreso tra 1582 e 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 valore dell'anno di cambio data è 2049 (impostazione predefinita), l'anno a due cifre 49 è interpretato come 2049 mentre l'anno a due cifre 50 è interpretato come 1950. Il formato predefinito della data è determinato dall'impostazione della lingua corrente. È possibile modificare il formato di data usando le istruzioni SET LANGUAGE e SET DATEFORMAT. Il formato ydm non è supportato per date. |
Espressione alfabetica | Descrizione |
---|---|
mon [dd][,] yyyy mon dd[,] [yy] mon yyyy [dd] [dd] mon[,] yyyy dd mon[,][yy]yy dd [yy]yy mon [dd] yyyy mon yyyy mon [dd] yyyy [dd] mon |
mon (mese) rappresenta il nome completo o l'abbreviazione del mese nella 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. |
ISO 8601 | Descrizione |
---|---|
YYYY-MM-DD YYYYMMDD |
Uguale allo standard SQL. Si tratta dell'unico formato definito come standard internazionale. |
Senza separatori | Descrizione |
---|---|
[yy]yymmdd yyyy[mm][dd] |
I dati relativi all'elemento date possono essere specificati con quattro, sei o otto cifre. Una stringa a sei o otto cifre viene sempre interpretata come ymd. Il mese e il giorno devono sempre essere rappresentati da due cifre. Una stringa di quattro cifre viene interpretata come anno. |
ODBC | Descrizione |
---|---|
{ d 'yyyy-mm-dd' } | Specifico delle API ODBC |
Formato W3C XML | Descrizione |
---|---|
yyyy-mm-ddTZD | Supportato per l'utilizzo di XML/SOAP. TZD è l'identificatore del fuso orario (Z, + hh:mm o - hh:mm): - hh:mm rappresenta la differenza di fuso orario. hh è un numero di due cifre, compreso tra 0 e 14, che rappresenta il numero di ore della differenza di fuso orario. - MM è un numero di due cifre, compreso tra 0 e 59, che rappresenta il numero di minuti aggiuntivi della differenza di 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 della differenza di fuso orario è da -14:00 a +14:00. |
Conformità agli standard ANSI e ISO 8601
date è conforme alla definizione dello standard ANSI SQL per il calendario gregoriano: "NOTE 85 - Datetime data types will allow dates in the Gregorian format to be stored in the date range 0001-01-01 CE through 9999-12-31 CE."
Il formato predefinito dei valori letterali stringa usato per i client legacy è conforme al formato standard SQL, definito come AAAA-MM-GG. Questo formato è lo stesso della definizione ISO 8601 per DATE.
Nota
Per Informatica, l'intervallo è tra 1582-10-15 (15 ottobre 1582) e 9999-12-31 (31 dicembre 9999).
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 o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Stringa o SqString |
date | YYYY-MM-DD | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Stringa o SqString |
datetime2 | AAAA-MM-GG hh:mm:ss[.nnnnnnn] | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Stringa o SqString |
datetimeoffset | AAAA-MM-GG hh:mm:ss[.nnnnnnn] [+|-]hh:mm | SQL_WVARCHAR o SQL_VARCHAR | DBTYPE_WSTR o DBTYPE_STR | Java.sql.String | Stringa o SqString |
Conversione dei dati relativi a 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 funzioni CAST e CONVERT con i dati relativi a data e ora, vedere CAST e CONVERT (Transact-SQL).
Conversione del tipo di dati date in altri tipi di dati relativi a 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 viene eseguita in time(n) , ha esito negativo e viene generato il messaggio di errore 206: "Conflitto del tipo di operando: date è incompatibile con time".
Se viene eseguita la conversione in datetime, la data viene copiata. Nel codice seguente vengono illustrati i risultati della conversione di un valore date
in un valore datetime
.
DECLARE @date date= '12-10-25';
DECLARE @datetime datetime= @date;
SELECT @date AS '@date', @datetime AS '@datetime';
--Result
--@date @datetime
------------ -----------------------
--2025-12-10 2025-12-10 00:00:00.000
--
--(1 row(s) affected)
Quando viene eseguita la conversione in smalldatetime, se il valore di date è compreso nell'intervallo smalldatetime, il componente relativo alla data viene copiato mentre quello relativo all'ora viene impostato su 00:00:00.000. Quando il valore date non è compreso nell'intervallo di un valore smalldatetime, viene generato il messaggio di errore 242: "La conversione di un tipo di dati date in smalldatetime ha generato un valore non compreso nell'intervallo dei valori consentiti" e il valore smalldatetime viene impostato su NULL. Nel codice seguente vengono illustrati i risultati della conversione di un valore date
in un valore smalldatetime
.
DECLARE @date date= '1912-10-25';
DECLARE @smalldatetime smalldatetime = @date;
SELECT @date AS '@date', @smalldatetime AS '@smalldatetime';
--Result
--@date @smalldatetime
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00
--
--(1 row(s) affected)
Per la conversione in datetimeoffset(n) , la data viene copiata e l'ora viene impostata su 00:00.0000000 +00:00. Nel codice seguente vengono illustrati i risultati della conversione di un valore date
in un valore datetimeoffset(3)
.
DECLARE @date date = '1912-10-25';
DECLARE @datetimeoffset datetimeoffset(3) = @date;
SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset';
--Result
--@date @datetimeoffset
------------ ------------------------------
--1912-10-25 1912-10-25 00:00:00.000 +00:00
--
--(1 row(s) affected)
Quando viene eseguita la conversione in datetime2(n) , il componente relativo alla data viene copiato e quello relativo all'ora viene impostato su 00:00.000000. Nel codice seguente vengono illustrati i risultati della conversione di un valore date
in un valore datetime2(3)
.
DECLARE @date date = '1912-10-25'
DECLARE @datetime2 datetime2(3) = @date;
SELECT @date AS '@date', @datetime2 AS '@datetime2(3)';
--Result
--@date @datetime2(3)
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00.000
--
--(1 row(s) affected)
Conversione di valori letterali stringa nel tipo di dati date
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 esplicite che non specificano uno stile, dai tipi di data e ora ai valori letterali stringa, saranno 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 | date |
---|---|
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 | Verrà 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('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 |
Opzione introdotta in SQL Server 2008.