Dai di Data e ora
SQL Server 2008 ha introdotto nuovi tipi di dati per la gestione delle informazioni relative a data e ora. I nuovi tipi di dati includevano 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. |