Partager via


Prise en charge du type de données pour les améliorations Date/Heure (ODBC)

Cette rubrique fournit des informations sur les types ODBC qui prennent en charge les types des données SQL Server date et time.

Mappage de type de données dans les paramètres et les jeux de résultats

En plus des types de données ODBC (SQL_TYPE_TIMESTAMP et SQL_TIMESTAMP), deux nouveaux types de données sont requis dans ODBC SQL Server Native Client pour exposer les nouveaux types de serveur :

  • SQL_SS_TIME2

  • SQL_TIMESTAMPOFFSET

Le tableau ci-dessous correspond au mappage complet de type serveur. Remarquez que certaines cellules contiennent deux entrées ; dans ces cas, la première est la valeur ODBC 3.0 et la seconde la valeur ODBC 2.0.

Type de données SQL Server

Type de données SQL

Valeur

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)

Temps

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)

Le tableau suivant répertorie les structures et les types ODBC correspondants. Comme ODBC n'autorise pas les types C définis par le pilote, SQL_C_BINARY est utilisé pour les types time et datetimeoffset comme structures binaires.

Type de données SQL

Disposition en mémoire

Type de données C par défaut

Valeur (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)

Lorsque la liaison SQL_C_BINARY est spécifiée, la vérification de l'alignement est effectuée et une erreur signalée en cas d'alignement incorrect. Dans le cas de cette erreur, SQLSTATE a la valeur IM016, avec le message « Alignement des structures non valide ».

Formats de données : chaînes et littéraux

Le tableau suivant représente les mappages entre les types de données SQL Server, les types de données ODBC et les littéraux de chaîne ODBC.

Type de données SQL Server

Type de données ODBC

Format de chaîne pour les conversions clientes

Datetime

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

'aaaa-mm-jj hh:mm:ss[.999]'

SQL Server prend en charge jusqu'à trois chiffres de fractions de seconde pour le type Datetime.

Smalldatetime

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

'aaaa-mm-jj hh:hh:ss'

Ce type de données possède une précision d'une minute. Le composant des secondes sera égal à zéro en sortie et arrondi par le serveur en entrée.

Date

SQL_TYPE_DATE

SQL_DATE

'aaaa-mm-jj'

Time

SQL_SS_TIME2

'hh:mm:ss[.9999999]'

Le cas échéant, les fractions de seconde peuvent être spécifiées à l'aide de sept chiffres au plus.

Datetime2

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

'aaaa-mm-jj hh:mm:ss[.9999999]'

Le cas échéant, les fractions de seconde peuvent être spécifiées à l'aide de sept chiffres au plus.

DatetimeOFFSET

SQL_SS_TIMESTAMPOFFSET

'aaaa-mm-jj hh:mm:ss[.9999999] +/- hh:mm'

Le cas échéant, les fractions de seconde peuvent être spécifiées à l'aide de sept chiffres au plus.

Il n'y a pas de modifications aux séquences d'échappement ODBC pour les littéraux de type date/time.

Dans les résultats, les fractions de seconde utilisent toujours un point (.), plutôt que les deux-points (:).

Les valeurs de chaîne retournées aux applications sont toujours de la même longueur pour une colonne donnée. La longueur maximale des composants année, mois, jour, heure, minute et seconde, est complétée avec des zéros non significatifs, et le jour et l'heure des valeurs datetime sont séparés par un espace. Il y a également un espace entre l'heure et le décalage horaire dans une valeur datetimeoffset. Un décalage horaire est toujours précédé d'un signe ; quand le décalage est nul, le signe est un plus (+). Les fractions de seconde sont complétées si nécessaire avec des zéros à droite, jusqu'à la précision maximale définie pour la colonne. Pour les colonnes datetime, il y a trois chiffres de fractions de seconde. Pour les colonnes smalldatetime, il n'y a pas de chiffres de fractions de seconde et les secondes sont toujours égales à zéro.

Une chaîne vide n'est pas un littéral date/time valide et ne représente pas une valeur NULL. La tentative de convertir une chaîne vide en valeur date/time provoque l'erreur SQLState 22018 et le message « Valeur de caractère non valide pour la spécification de la casse ».

Les conversions de paramètres de chaîne attendent des chaînes au même format, si ce n'est que le signe d'une valeur timezone avec les heures et les minutes nulles peut être plus ou moins, et que les zéros à droite sont autorisés pour les fractions de seconde composées au plus de 9 chiffres. Un composant heure peut se terminer avec une virgule décimale et aucun chiffre de fractions de seconde.

Actuellement, le pilote autorise un espace supplémentaire autour des caractères de ponctuation et l'espace entre l'heure et le décalage horaire est facultatif. Toutefois, il se peut qu'il en aille différemment dans une version ultérieure ; les applications ne doivent pas s'appuyer sur le comportement actuel.

Formats des données : structures de données

Dans les structures décrites ci-après, ODBC spécifie les contraintes suivantes, extraites du calendrier grégorien :

  • La plage des mois est comprise entre 1 et 12.

  • La plage du champ Day est comprise entre 1 et le nombre de jours dans le mois, et doit être cohérente avec les champs Year et Month en prenant en compte les années bissextiles.

  • La plage du champ Hour est comprise entre 0 et 23.

  • La plage du champ Minute est comprise entre 0 et 59.

  • La plage des secondes est 0 comprise entre 0 et 61.9 (n). Cela permet l'ajout de deux secondes intercalaires (au plus) pour maintenir la synchronisation avec l'heure sidérale.

    Notez que, comme SQL Server n'autorise pas les secondes intercalaires, les valeurs de de secondes supérieures à 59 provoquent une erreur de serveur.

Les implémentations pour les structs ODBC existants suivants ont été modifiées afin de prendre en charge les nouveaux types de données date et time SQL Server. Toutefois, les définitions n'ont pas changé.

  • DATE_STRUCT

  • TIME_STRUCT

  • TIMESTAMP_STRUCT

Il existe aussi deux nouveaux structs :

  • SQL_SS_TIME2_STRUCT

  • SQL_SS_TIMESTAMPOFFSET_STRUCT

SQL_SS_TIME2_STRUCT

Ce struct est nouveau dans SQL Server 2008 et est complété jusqu'à 12 octets sur les systèmes d'exploitation 32 bits et 64 bits.

typedef struct tagSS_TIME2_STRUCT {
   SQLUSMALLINT hour;
   SQLUSMALLINT minute;
   SQLUSMALLINT second;
   SQLUINTEGER fraction;
} SQL_SS_TIME2_STRUCT;

SQL_SS_TIMESTAMPOFFSET_STRUCT

Ce struct est nouveau dans 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;

Si timezone_hour est négatif, timezone_minute doit être négatif ou égal à zéro. Si timezone_hour est positif, timezone_minute doit être positif ou égal à zéro. Si timezone_hour est égal à zéro, timezone_minute peut avoir une valeur comprise entre - 59 et + 59.