Supporto dei tipi di dati per i miglioramenti relativi a data e ora ODBC

Si applica a:SQL ServerDatabase SQL diAzure Istanzagestita di SQL di Azure Azure Synapse Analytics PlatformSystem (PDW)

In questo argomento vengono fornite informazioni sui tipi ODBC che supportano i tipi di dati di data e ora di SQL Server.

Mapping dei tipi di dati nei parametri e nei set di risultati

Oltre ai tipi di dati ODBC (SQL_TYPE_TIMESTAMP e SQL_TIMESTAMP), sono stati aggiunti due nuovi tipi di dati in ODBC di SQL Server Native Client per esporre i nuovi tipi di server:

  • SQL_SS_TIME2

  • SQL_SS_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 di 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)
Inserimento ore 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 in 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_SS_TIME2

SQL_C_BINARY (ODBC 3.5 e versioni precedenti)
0x4000 (sqlncli.h)

SQL_BINARY (-2)
SQL_SS_TIMESTAMPOFFSET SQL_SS_TIMESTAMPOFFSET_STRUCT SQL_C_SS_TIMESTAMPOFFSET

SQL_C_BINARY (ODBC 3.5 e versioni precedenti)
0x4001 (sqlncli.h)

SQL_BINARY (-2)

Quando viene specificata l'associazione SQL_C_BINARY, viene eseguito il controllo dell'allineamento e viene segnalato un errore in caso di 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 i tipi di dati di SQL Server, i tipi di dati ODBC e i valori letterali stringa ODBC.

Tipo di dati di 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 dei secondi sarà zero nell'output mentre verrà arrotondato dal server nell'input.
Date SQL_TYPE_DATE

SQL_DATE
'yyyy-mm-dd'
Inserimento ore 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
'aaaa-mm-gg 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 per le ore 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 nel mese e deve essere coerente con i campi dell'anno e del mese, considerando gli anni bisestili.

  • L'intervallo delle ore è compreso tra 0 e 23.

  • L'intervallo dei 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.

    Si noti che SQL Server non consente secondi intercalari, quindi i valori di secondo maggiori di 59 causeranno un errore del server.

Le implementazioni per i seguenti struct ODBC esistenti sono state modificate per supportare i nuovi tipi di dati di data e ora di SQL Server. Le definizioni, tuttavia, non sono state modificate.

  • DATE_STRUCT

  • TIME_STRUCT

  • TIMESTAMP_STRUCT

Sono inoltre disponibile due nuove strutture:

  • SQL_SS_TIME2_STRUCT

  • SQL_SS_TIMESTAMPOFFSET_STRUCT

SQL_SS_TIME2_STRUCT

In questa struttura è possibile aggiungere fino a 12 byte nei 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

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 il timezone_hour è negativo, il timezone_minute deve essere negativo o zero. Se il timezone_hour è positivo, il timezone_minute deve essere positivo o zero. Se il timezone_hour è zero, il timezone_minute può avere qualsiasi valore compreso nell'intervallo da -59 a +59.

Vedi anche

Miglioramenti relativi a data e ora (ODBC)