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
, dd
e [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 tra0
e14
, che rappresentano il numero di ore nella differenza di fuso orario.mm
è di due cifre, compreso tra0
e59
, 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 |