Lingua

Dati di data e ora

In SQL Server 2008 sono stati introdotti tipi di dati separati per data e ora e tipi di dati espansi con intervallo più ampio, maggiore precisione e consapevolezza del fuso orario. Usare il pacchetto NuGet Microsoft.Data.SqlClient per accedere a questi tipi di dati dalle applicazioni client. Per gli esempi in questo articolo, importare Microsoft.Data.SqlClient e System.Data in C# o Visual Basic. I tipi di valore SQL comuni rimangono in System.Data.SqlTypes.

Le versioni di SQL Server precedenti a SQL Server 2008 hanno solo due tipi di dati per l'uso dei valori di data e ora: datetime e smalldatetime. Entrambi questi tipi di dati contengono sia il valore della data che un valore dell'ora e quindi risulta difficile usare solo uno dei due valori. Questi tipi di dati inoltre supportano solo le date che cadono dopo l'introduzione del calendario gregoriano, avvenuta nel 1753 in Inghilterra. Un'altra limitazione è che i tipi di dati più datati non dipendono dal fuso orario e per questo motivo è difficile lavorare con dati che provengono da più fusi orari.

Per ulteriori informazioni sui tipi di data e ora in SQL Server, vedere Tipi di dati e funzioni di data e ora.

Tipi di dati relativi a data e ora introdotti in SQL Server 2008

Nella seguente tabella vengono illustrati i nuovi tipi di dati per data e ora.

Tipo di dati di SQL Server Descrizione
date Il tipo di dati date include un intervallo compreso tra il 1 gennaio 01 e il 31 dicembre 9999 con un'accuratezza di 1 giorno. Il valore predefinito è 1 gennaio 1900. La dimensione dello spazio di archiviazione è 3 byte.
time Il tipo di dati time archivia esclusivamente i valori temporali basati su un orologio a 24 ore. Il tipo di dati time ha un intervallo compreso tra 00:00:00.0000000 e 23:59:59.9999999 con un'accuratezza di 100 nanosecondi. Il valore predefinito è 00:00:00.0000000 (mezzanotte). Il tipo di dati time supporta la precisione in secondi frazionari definita dall'utente e le dimensioni di archiviazione variano da 3 a 6 byte in base alla precisione specificata.
datetime2 Il tipo di dati datetime2 combina l'intervallo e la precisione dei tipi di dati date e time in un unico tipo di dati.

I valori predefiniti e i formati di valore letterale stringa sono gli stessi definiti nei tipi di dati date e time.
datetimeoffset Il tipo di dati datetimeoffset include tutte le funzionalità di datetime2, con l'aggiunta di un offset di fusi orari. L'offset di fusi orari è rappresentato in formato [+|-] HH:MM. HH è un numero di due cifre, compreso tra 00 e 14, che rappresenta il numero di ore nella differenza di fuso orario. MM è un numero di due cifre, compreso tra 00 e 59, che rappresenta il numero di minuti aggiuntivi della differenza di fuso orario. I formati di ora sono supportati fino a 100 nanosecondi. Il segno + o - obbligatorio indica se la differenza di fuso orario viene aggiunta o sottratta dall'ora UTC (Universal Time Coordinate o ora di Greenwich) per ottenere l'ora locale.

Nota

Per altre informazioni sull'uso della parola chiave Type System Version, vedere ConnectionString.

Formato e ordine della data

Il modo in cui SQL Server analizza i valori di data e ora dipende non solo dalla versione del sistema di tipi e dalla versione del server, ma anche dalle impostazioni della lingua predefinita e del formato di data del server. Una stringa di data che funziona per i formati di data di una lingua potrebbe non essere riconoscibile se la query viene eseguita da una connessione che usa un'altra impostazione per la lingua e il formato di data.

L'istruzione Transact-SQL SET LANGUAGE imposta in modo implicito l'impostazione DATEFORMAT che determina l'ordine delle parti della data. È possibile usare l'istruzione SET DATEFORMAT Transact-SQL in una connessione per evitare ambiguità tra i valori di data ordinando le parti della data in ordine MDY, DMY, YMD, YDM, MYD o DYM.

Se non si specifica alcun elemento DATEFORMAT per la connessione, SQL Server usa la lingua predefinita associata alla connessione. Ad esempio, una stringa di data "01/02/03" verrà interpretata come MDY (2 gennaio 2003) su un server con un'impostazione di lingua inglese degli Stati Uniti e come DMY (1 febbraio 2003) su un server con un'impostazione di lingua inglese britannico. L'anno viene determinato utilizzando la regola dell'anno di cutoff di SQL Server, che definisce la data limite per l'assegnazione del valore del secolo. Per ulteriori informazioni, consultare l'opzione di esclusione degli anni a due cifre.

Nota

Il YDM formato della data non è supportato durante la conversione da un formato stringa a date, time, datetime2o datetimeoffset.

Per ulteriori informazioni sulla modalità di interpretazione dei dati relativi a data e ora in SQL Server, vedere Utilizzo di dati relativi a data e ora.

Tipi di dati e parametri relativi a data e ora

Le enumerazioni riportate di seguito sono state aggiunte a SqlDbType per supportare i nuovi tipi di dati relativi a data e ora.

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffset

Per specificare il tipo di dati per l'oggetto SqlParameter , utilizzare uno dei valori di enumerazione precedenti SqlDbType .

Nota

Non è possibile impostare la proprietà DbType di un SqlParameter su SqlDbType.Date.

Per specificare il tipo di parametro in modo generico, impostare la proprietà DbType sul valore dell'enumerazione DbType. I seguenti valori DbType supportano i tipi di dati datetime2 e datetimeoffset:

  • DbType.DateTime2

  • DbType.DateTimeOffset

Queste nuove enumerazioni integrano le enumerazioni Date, Time e DateTime, che erano presenti nelle versioni precedenti di .NET Framework.

Il tipo di un oggetto parametro del provider di dati .NET Framework viene dedotto dal tipo del valore dell'oggetto parametro .NET Framework o dal valore DbType dell'oggetto parametro. Non sono stati introdotti nuovi tipi di dati System.Data.SqlTypes per supportare i nuovi tipi di dati di data e ora. Nella tabella seguente sono descritti i mapping tra i tipi di dati per data e ora di SQL Server 2008 e i tipi di dati CLR.

Tipo di dati di SQL Server Tipo .NET Framework System.Data.SqlDbType System.Data.DbType
date System.DateTime Date Date
time System.TimeSpan Time Time
datetime2 System.DateTime DateTime2 DateTime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
datetime System.DateTime DateTime DateTime
smalldatetime System.DateTime DateTime DateTime

Proprietà di SqlParameter

Nella tabella seguente vengono descritte le proprietà SqlParameter pertinenti ai tipi di dati per data e ora.

Proprietà Descrizione
IsNullable Ottiene o imposta se un valore è nullable. Quando si invia un valore di parametro Null al server, è necessario specificare DBNull anziché null (Nothing in Visual Basic). Per altre informazioni sui valori null di database, vedere Handling Null Values.
Precision Ottiene o imposta il numero massimo di cifre usate per rappresentare il valore. Questa impostazione viene ignorata per i tipi di dati relativi a data e ora.
Scale Ottiene o imposta la precisione delle frazioni di secondo per Time, DateTime2 e DateTimeOffset. Se non si imposta in modo esplicito la scala, il driver invia la scala 7. Impostare in modo esplicito la scala su 0 richiede zero cifre delle frazioni di secondo.
Size Viene ignorata per i tipi di dati relativi a data e ora.
Value Ottiene o imposta il valore del parametro.
SqlValue Ottiene o imposta il valore del parametro.

Nota

I valori di ora minori di zero o maggiori o uguali a 24 ore genereranno un ArgumentException.

Creazione di parametri

Creare SqlParameter oggetti con il costruttore o chiamare il Add metodo nella raccolta del Parameters comando. Il Add metodo accetta argomenti del costruttore o un oggetto parametro esistente.

Le sezioni successive di questo argomento contengono esempi che illustrano come specificare i parametri di data e ora. Per altri esempi di utilizzo dei parametri, vedere Configurazione di parametri e tipi di dati dei parametri e Parametri DataAdapter.

Esempio relativo a Date

Il frammento di codice seguente illustra come specificare un parametro date.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@Date";
parameter.SqlDbType = SqlDbType.Date;
parameter.Value = "2007/12/1";
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Date"
parameter.SqlDbType = SqlDbType.Date
parameter.Value = "2007/12/1"

Esempio relativo al tempo

Il frammento di codice seguente illustra come specificare un parametro time.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@time";
parameter.SqlDbType = SqlDbType.Time;
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Time"
parameter.SqlDbType = SqlDbType.Time
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay

Esempio relativo a DateTime2

Il frammento di codice seguente illustra come specificare un parametro datetime2 con parti sia di data che di ora.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@Datetime2";
parameter.SqlDbType = SqlDbType.DateTime2;
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Datetime2"
parameter.SqlDbType = SqlDbType.DateTime2
parameter.Value = DateTime.Parse("1666-09-02 1:00:00")

Esempio relativo a DateTimeOffset

Il frammento di codice seguente illustra come specificare un parametro DateTimeOffset con una data, un'ora e una differenza di fuso orario pari a 0.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@DateTimeOffSet";
parameter.SqlDbType = SqlDbType.DateTimeOffset;
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@DateTimeOffSet"
parameter.SqlDbType = SqlDbType.DateTimeOffset
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00")

AddWithValue

Per specificare i parametri, è anche possibile chiamare AddWithValue sulla raccolta del Parameters comando, come illustrato nel frammento di codice seguente. Tuttavia, AddWithValue non consente di specificare DbType o SqlDbType per il parametro.

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"));
command.Parameters.AddWithValue( _
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"))

Per questo DateTimeOffset valore, AddWithValue deduce SqlDbType.DateTimeOffset. Per impostare come destinazione un diverso tipo di data o ora di SQL Server, impostare in modo esplicito la proprietà del parametro SqlDbType.

Nella tabella seguente sono riportati gli elementi SqlDbTypes dedotti da tipi CLR specifici.

Tipo CLR Dedotto SqlDbType
DateTime SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

Recupero di dati relativi a data e ora

Nella tabella seguente sono descritti i metodi usati per recuperare i valori di SQL Server 2008 relativi a data e ora.

Metodo SqlClient Descrizione
GetDateTime Recupera il valore di colonna specificato come DateTime.
GetDateTimeOffset Recupera il valore di colonna specificato come DateTimeOffset.
GetProviderSpecificFieldType Restituisce il tipo che rappresenta il tipo specifico del provider sottostante per il campo. Restituisce gli stessi tipi di GetFieldType per i nuovi tipi di data e ora.
GetProviderSpecificValue Recupera il valore della colonna specificata. Restituisce gli stessi tipi di GetValue per i nuovi tipi di data e ora.
GetProviderSpecificValues Recupera i valori della matrice specificata.
GetSqlString Recupera il valore della colonna nel formato SqlString. Il metodo genera InvalidCastException se i dati non possono essere espressi come SqlString.
GetSqlValue Recupera i dati della colonna come predefinito SqlDbType. Restituisce gli stessi tipi di GetValue per i nuovi tipi di data e ora.
GetSqlValues Recupera i valori della matrice specificata.
GetString Recupera il valore della colonna come stringa se Type System Version è impostata su SQL Server 2005. Il metodo genera InvalidCastException se i dati non possono essere espressi come stringa.
GetTimeSpan Recupera il valore di colonna specificato come TimeSpan.
GetValue Recupera il valore della colonna specificata come tipo CLR sottostante.
GetValues Recupera i valori colonna in una matrice.
GetSchemaTable Restituisce i metadati del set di risultati nell'oggetto DataTable .

Nota

La nuova data e ora SqlDbTypes non sono supportate per il codice eseguito in-processo in SQL Server. Se uno di questi tipi viene passato al server, verrà generata un'eccezione.

Impostazione di valori di data e ora come valori letterali

È possibile specificare tipi di dati di data e ora usando diversi formati di stringa letterale, che SQL Server valuta quindi in fase di esecuzione, convertendoli in strutture di data/ora interne. SQL Server riconosce i dati di data e ora racchiusi tra virgolette singole ('). Negli esempi seguenti sono illustrati alcuni formati:

  • Formati di data alfabetici, ad esempio 'October 15, 2006'.

  • Formati di data numerici, ad esempio '10/15/2006'.

  • Formati di stringa senza separatori, ad esempio '20061015', che vengono interpretati come 15 ottobre 2006 se si usa il formato di data ISO standard.

I valori di ora minori di zero o maggiori o uguali a 24 ore genereranno un ArgumentException.

Risorse della documentazione di SQL Server

Per altre informazioni sull'uso dei valori di data e ora in SQL Server, vedere gli articoli seguenti.

Articolo Descrizione
Funzioni e tipi di dati di data e ora (Transact-SQL) Viene fornita una panoramica di tutte le funzioni e i tipi di dati relativi a data e ora di Transact-SQL.
Uso di dati relativi a data e ora Informazioni sui tipi di dati e le funzioni relativi a data e ora ed esempi per l'uso.
Tipi di dati (Transact-SQL) Vengono descritti i tipi di dati di sistema inclusi in SQL Server.

Vedi anche