Condividi tramite


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.