Supporto dei tipi di dati per i miglioramenti relativi alla data/ora ODBC
In questo argomento vengono fornite informazioni sui tipi ODBC che supportano i tipi di dati SQL Server di data e ora.
Mapping dei tipi di dati nei parametri e nei set di risultati
Oltre ai tipi di dati ODBC (SQL_TYPE_TIMESTAMP e SQL_TIMESTAMP), nel driver ODBC di SQL Server Native Client sono necessari due nuovi tipi di dati per esporre i nuovi tipi di server:
SQL_SS_TIME2
SQL_TIMESTAMPOFFSET
Nella tabella seguente viene illustrato il mapping completo per il tipo di server. Si noti che alcune celle della tabella contengono due voci; in questi casi, la prima è il valore per ODBC 3.0 mentre la seconda è il valore per ODBC 2.0.
Tipo di dati SQL Server |
Tipo di dati SQL |
Valore |
---|---|---|
Datetime |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
93 (sql.h) 11 (sqlext.h) |
Smalldatetime |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
93 (sql.h) 11 (sqlext.h) |
Date |
SQL_TYPE_DATE SQL_DATE |
91 (sql.h) 9 (sqlext.h) |
Time |
SQL_SS_TIME2 |
-154 (SQLNCLI.h) |
DatetimeOFFSET |
SQL_SS_TIMESTAMPOFFSET |
-155 (SQLNCLI.h) |
Datetime2 |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
93 (sql.h) 11 (sqlext.h) |
Nella tabella seguente vengono elencati i tipi ODBC C e le strutture corrispondenti. Poiché ODBC non consente i tipi C definiti dal driver, viene utilizzato SQL_C_BINARY per time e datetimeoffset come strutture binarie.
Tipo di dati SQL |
Layout della memoria |
Tipo di dati C predefinito |
Valore (sqlext.h) |
---|---|---|---|
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
SQL_TIMESTAMP_STRUCT TIMESTAMP_STRUCT |
SQL_C_TYPE_TIMESTAMP SQL_C_TIMESTAMP |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
SQL_TYPE_DATE SQL_DATE |
SQL_DATE_STRUCT DATE_STRUCT |
SQL_C_TYPE_DATE SQL_C_DATE |
SQL_TYPE_DATE SQL_DATE |
SQL_SS_TIME2 |
SQL_SS_TIME2_STRUCT |
SQL_C_BINARY |
SQL_BINARY (-2) |
SQL_SS_TIMESTAMPOFFSET |
SQL_SS_TIMESTAMPOFFSET_STRUCT |
SQL_C_BINARY |
SQL_BINARY (-2) |
Quando viene specificata l'associazione SQL_C_BINARY, viene eseguito il controllo dell'allineamento e viene riportato un errore per l'allineamento non corretto. L'identificativo SQLSTATE per questo errore è IM016, con un messaggio indicante che l'allineamento della struttura non è corretto.
Formati di dati: stringhe e valori letterali
Nella tabella seguente vengono illustrati i mapping tra tipi di dati SQL Server, tipi di dati ODBC e valori letterali stringa ODBC.
Tipo di dati SQL Server |
Tipo di dati ODBC |
Formato stringa per le conversioni client |
---|---|---|
Datetime |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
'yyyy-mm-dd hh:mm:ss[.999]' SQL Server supporta fino a tre cifre per i secondi frazionari per Datetime. |
Smalldatetime |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
'yyyy-mm-dd hh:hh:ss' Questo tipo di dati ha un'accuratezza di un minuto. Il componente secondi sarà zero nell'output mentre verrà arrotondato dal server nell'input. |
Date |
SQL_TYPE_DATE SQL_DATE |
'yyyy-mm-dd' |
Time |
SQL_SS_TIME2 |
'hh:mm:ss[.9999999]' I secondi frazionari possono essere specificati facoltativamente utilizzando fino a sette cifre. |
Datetime2 |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
'yyyy-mm-dd hh:mm:ss[.9999999]' I secondi frazionari possono essere specificati facoltativamente utilizzando fino a sette cifre. |
DatetimeOFFSET |
SQL_SS_TIMESTAMPOFFSET |
'yyyy-mm-dd hh:mm:ss[.9999999] +/- hh:mm' I secondi frazionari possono essere specificati facoltativamente utilizzando fino a sette cifre. |
Non vi sono modifiche nelle sequenze di escape ODBC per i valori letterali di data/ora.
I secondi frazionari nei risultati utilizzano sempre il punto (.), anziché i due punti (:).
I valori stringa restituiti alle applicazioni sono sempre della stessa lunghezza per una specifica colonna. Nei componenti anno, mese, giorno, ora, minuto e secondo vengono aggiunti zero iniziali fino alla lunghezza massima e nei valori datetime è presente uno spazio tra la data e l'ora. È inoltre presente uno spazio tra l'ora e la differenza di fuso orario in un valore datetimeoffset. La differenza di fuso orario viene sempre preceduta da un segno. Quando la differenza è zero, il segno è un più (+). Se necessario, nei secondi frazionari vengono aggiunti zero finali fino alla precisione definita per la colonna. Per le colonne di tipo datetime, vi sono tre cifre per i secondi frazionari. Per le colonne di tipo smalldatetime, non vi sono cifre per i secondi frazionari e i secondi saranno sempre zero.
Una stringa vuota non è un valore letterale di data/ora valido e non rappresenta un valore NULL. Un tentativo di convertire una stringa vuota in un valore di data/ora genererà un errore con l'identificativo SQLState 22018 e il messaggio "Carattere non valido per la specifica del cast".
Nelle conversioni dai parametri di stringa si otterranno stringhe nello stesso formato, ad eccezione del fatto che il segno di un fuso orario con zero ore e zero minuti può essere sia più che meno e che sono consentiti zero finali per i secondi frazionari fino a un massimo di 9 cifre. Un componente ora può terminare con un separatore decimale e senza cifre per i secondi frazionari.
Il driver consente attualmente uno spazio vuoto aggiuntivo prima e dopo i caratteri di punteggiatura mentre lo spazio tra l'ora e la differenza di fuso orario è facoltativo. Nelle versioni future tuttavia queste regole potrebbero essere modificate, per cui le applicazioni non devono basarsi sul comportamento corrente.
Formati di dati: strutture di dati
Nelle strutture descritte di seguito, ODBC specifica i vincoli seguenti, secondo il calendario gregoriano:
L'intervallo per i mesi è compreso tra 1 e 12.
L'intervallo per il campo del giorno è compreso tra 1 e il numero di giorni del mese e deve essere coerente con i campi dell'anno e del mese, considerando gli anni bisestili.
L'intervallo per le ore è compreso tra 0 e 23.
L'intervallo per i minuti è compreso tra 0 e 59.
L'intervallo per i secondi è compreso tra 0 e 61,9(n), consentendo fino a due secondi di compensazione per mantenere la sincronizzazione con l'ora siderale.
Notare che SQL Server non consente i secondi di compensazione, pertanto i valori dei secondi maggiori di 59 generano un errore del server.
Sono state modificate le implementazioni per le seguenti strutture ODBC esistenti in modo da supportare i nuovi tipi SQL Server di data e ora. Non sono state però modificate le definizioni.
DATE_STRUCT
TIME_STRUCT
TIMESTAMP_STRUCT
Sono inoltre disponibile due nuove strutture:
SQL_SS_TIME2_STRUCT
SQL_SS_TIMESTAMPOFFSET_STRUCT
SQL_SS_TIME2_STRUCT
Questa struttura è nuova in SQL Server 2008 e possono esservi aggiunti fino a 12 byte in entrambi i sistemi operativi a 32 bit e a 64 bit.
typedef struct tagSS_TIME2_STRUCT {
SQLUSMALLINT hour;
SQLUSMALLINT minute;
SQLUSMALLINT second;
SQLUINTEGER fraction;
} SQL_SS_TIME2_STRUCT;
SQL_SS_TIMESTAMPOFFSET_STRUCT
Questa struttura è nuova in SQL Server 2008:
typedef struct tagSS_TIMESTAMPOFFSET_STRUCT {
SQLSMALLINT year;
SQLUSMALLINT month;
SQLUSMALLINT day;
SQLUSMALLINT hour;
SQLUSMALLINT minute;
SQLUSMALLINT second;
SQLUINTEGER fraction;
SQLSMALLINT timezone_hour;
SQLSMALLINT timezone_minute;
} SQL_SS_TIMESTAMPOFFSET_STRUCT;
Se timezone_hour è negativo, timezone_minute deve essere negativo o zero. Se timezone_hour è positivo, timezone_minute deve essere positivo o zero. Se timezone_hour è zero, timezone_minute può essere qualsiasi valore compreso nell'intervallo che va da -59 a +59.