Dati relativi a data e ora

SQL Server 2008 introduce nuovi tipi di dati per la gestione delle informazioni relative a data e ora. I nuovi tipi di dati includono tipi distinti per data e ora e tipi di dati espansi ottimizzati in termini di intervallo, precisione e riconoscimento del fuso orario. A partire da .NET Framework versione 3.5 Service Pack 1 (SP1), il provider di dati .NET Framework per SQL Server (System.Data.SqlClient) fornisce supporto completo per tutte le nuove funzionalità del Motore di database di SQL Server 2008. Per usare queste nuove funzionalità con SqlClient, è necessario installare .NET Framework 3.5 SP1 (o versione successiva).

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 i valori solo in base a un formato 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'oggetto DATEFORMAT che determina l'ordine delle parti della data. È possibile usare l'istruzione Transact-SQL SET DATEFORMAT per una connessione per distinguere i valori di data ordinando le parti della data nell'ordine MDY, DMY, YMD, MYD o DYM.

Se non si specifica alcun oggetto DATEFORMAT per la connessione, SQL Server usa la lingua predefinita associata alla connessione. Ad esempio, una stringa di data "01/02/03" viene interpretata come MDY (2 gennaio 2003) su un server con impostazione della lingua Inglese (Stati Uniti) e come DMY (1 febbraio 2003) su un server con impostazione della lingua Inglese (Regno Unito). L'anno viene determinato usando la regola dell'anno di cambio data di SQL Server, che definisce la data limite per l'assegnazione del valore di secolo. Per ulteriori informazioni, vedere l’Opzione two digit year cutoff.

Nota

Il formato di data YDM non è supportato quando si esegue la conversione da un formato stringa a date, time, datetime2 o 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

È possibile specificare il tipo di dati di un oggetto SqlParameter usando una delle enumerazioni SqlDbType precedenti.

Nota

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

È anche possibile specificare il tipo di un oggetto SqlParameter in modo generico impostando la proprietà DbType di un oggetto SqlParameter su un particolare valore dell'enumerazione DbType. I valori di enumerazione seguenti sono stati aggiunti a DbType per supportare 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
data System.DateTime Data Data
Ora System.TimeSpan Ora Ora
datetime2 System.DateTime DateTime2 DateTime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
datetime System.DateTime DataOra DataOra
smalldatetime System.DateTime DataOra DataOra

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 un valore che indica se il valore ammette i valori Null. 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 il numero di posizioni decimali in cui viene risolta la parte del valore relativa all'ora per Time, DateTime2 e DateTimeOffset. Il valore predefinito è 0, che indica che la scala effettiva viene dedotta dal valore e inviata al server.
Size Viene ignorata per i tipi di dati per 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

È possibile creare un oggetto SqlParameter usando il relativo costruttore o aggiungendolo a una raccolta SqlCommand di Parameters chiamando il metodo Add di SqlParameterCollection. Il metodo Add accetterà come input gli 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 a Time

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-02 1:00:00+0");  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@DateTimeOffSet"  
parameter.SqlDbType = SqlDbType.DateTimeOffSet  
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");  

AddWithValue

È anche possibile specificare i parametri usando il metodo AddWithValue di un SqlCommand, come illustrato nel frammento di codice seguente. Tuttavia, il metodo AddWithValue non consente di specificare DbType o SqlDbType per il parametro.

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("16660902"));  
command.Parameters.AddWithValue( _  
    "@date", DateTimeOffset.Parse("16660902"))  

È possibile eseguire il mapping del parametro @date a un tipo di dati date, datetime o datetime2 nel server. Quando si usano i nuovi tipi di dati datetime, è necessario impostare in modo esplicito la proprietà SqlDbType del parametro sul tipo di dati dell'istanza. L'uso di Variant o l'indicazione implicita di valori di parametro può causare problemi di compatibilità con le versioni precedenti per i tipi di dati datetime e smalldatetime.

Nella tabella seguente sono riportati gli elementi SqlDbTypes derivati tipi CLR specifici:

Tipo CLR SqlDbType derivato
Data/Ora 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 della colonna specificata come struttura DateTime.
GetDateTimeOffset Recupera il valore della colonna specificata come struttura 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 come SqlString. Si verifica un InvalidCastException se i dati non possono essere espressi come SqlString.
GetSqlValue Recupera i dati della colonna come SqlDbType predefinito. 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. Si verifica un InvalidCastException se non è possibile esprimere i dati come stringa.
GetTimeSpan Recupera il valore della colonna specificata come struttura TimeSpan.
GetValue Recupera il valore della colonna specificata come tipo CLR sottostante.
GetValues Recupera i valori colonna in una matrice.
GetSchemaTable Restituisce un oggetto DataTable che descrive i metadati del set di risultati.

Nota

I nuovi SqlDbTypes di data e ora non sono supportati per il codice eseguito In-Process 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 i tipi di dati relativi a data e ora usando svariati formati di stringa letterale, che poi SQL Server valuta 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