Compartir a través de


Compatibilidad con tipos de datos para mejoras de fecha y hora de ODBC

En este tema se proporciona información sobre los tipos ODBC compatibles con los tipos de datos de fecha y hora de SQL Server.

Asignación de tipos de datos en parámetros y conjuntos de resultados

Además de los tipos de datos de ODBC (SQL_TYPE_TIMESTAMP y SQL_TIMESTAMP), se requieren dos nuevos tipos de datos en ODBC de SQL Server Native Client para exponer los nuevos tipos de servidor:

  • SQL_SS_TIME2

  • SQL_TIMESTAMPOFFSET

La tabla siguiente muestra la asignación completa servidor-tipo. Observe que algunas celdas de la tabla contienen dos entradas; en esos casos, el primero es el valor de ODBC 3.0 y el segundo es el valor de ODBC 2.0.

Tipo de datos de SQL Server

Tipo de datos de SQL

Valor

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)

En la tabla siguiente se enumeran las estructuras y los tipos C de ODBC correspondientes. Puesto que ODBC no permite tipos C definidos por el controlador, se utiliza SQL_C_BINARY para time y datetimeoffset como estructuras binarias.

Tipo de datos de SQL

Diseño de memoria

Tipo de datos C predeterminado

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

Cuando se especifica el enlace SQL_C_BINARY, se comprueba la alineación y se emite un error para notificar que la alineación es incorrecta. El SQLSTATE para este error será IM016, con un mensaje del tipo "Alineación de estructura incorrecta".

Formatos de datos: Cadenas y literales

En la tabla siguiente se muestran las asignaciones entre tipos de datos de SQL Server, tipos de datos de ODBC y literales de cadena de ODBC.

Tipo de datos de SQL Server

Tipo de datos de ODBC

Formato de cadena para conversiones de cliente

Datetime

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

'yyyy-mm-dd hh:mm:ss[.999]'

SQL Server admite hasta tres dígitos en fracciones de segundo para Datetime.

Smalldatetime

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

'yyyy-mm-dd hh:hh:ss'

Este tipo de datos tiene una precisión de un minuto. El componente de segundos será cero en la salida y será redondeado por el servidor en la entrada.

Date

SQL_TYPE_DATE

SQL_DATE

'yyyy-mm-dd'

Time

SQL_SS_TIME2

'hh:mm:ss[.9999999]'

Las fracciones de segundo se pueden especificar si se desea utilizando hasta siete dígitos.

Datetime2

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

'yyyy-mm-dd hh:mm:ss[.9999999]'

Las fracciones de segundo se pueden especificar si se desea utilizando hasta siete dígitos.

DatetimeOFFSET

SQL_SS_TIMESTAMPOFFSET

'yyyy-mm-dd hh:mm:ss[.9999999] +/- hh:mm'

Las fracciones de segundo se pueden especificar si se desea utilizando hasta siete dígitos.

No hay ningún cambio en las secuencias de escape de ODBC para los literales de fecha y hora.

Las fracciones de segundo de los resultados siempre utilizan un punto (.), en lugar de dos puntos (:).

Los valores de cadena devueltos a las aplicaciones siempre tienen la misma longitud para una columna determinada. Los componentes de año, mes, día, hora, minuto y segundo se rellenan con ceros a la izquierda hasta su ancho máximo, y en los valores datetime hay un espacio entre la fecha y la hora. En los valores datetimeoffset también hay un espacio entre la hora y el ajuste de zona horaria. Un ajuste de zona horaria va siempre precedido de un signo; si el ajuste es cero, el signo es más (+). Las fracciones de segundo se rellenan con ceros a la derecha si es necesario, hasta la precisión definida para la columna. Para las columnas datetime, hay tres dígitos de fracciones de segundo. Para las columnas smalldatetime, no hay dígitos de fracciones de segundo y los segundos siempre serán cero.

Una cadena vacía no es un literal válido de fecha y hora y no representa un valor NULL. Un intento de convertir una cadena vacía en un valor de fecha y hora producirá el error SQLState 22018 y el mensaje "Valor de carácter no válido para especificación cast".

Las conversiones a partir de parámetros de cadena esperarán cadenas en el mismo formato, con la excepción de que el signo de una zona horaria con cero horas y cero minutos puede ser más o menos, y se permiten ceros a la derecha para las fracciones de segundo hasta un máximo de 9 dígitos. Un componente de hora puede finalizar con un separador decimal y ningún dígito para las fracciones de segundo.

Actualmente, el controlador permite un espacio en blanco adicional en torno a los caracteres de puntuación y el espacio entre la hora y el ajuste de zona horaria es opcional. Sin embargo, esto puede cambiar en una versión futura; las aplicaciones no deben basarse en el comportamiento actual.

Formatos de datos: Estructuras de datos

En las estructuras descritas a continuación, ODBC especifica las restricciones siguientes, que se toman del calendario gregoriano:

  • El intervalo de meses es de 1 a 12.

  • El intervalo de campos de día va de 1 al número de días del mes y debe ser coherente con los campos de año y de mes, teniendo en cuenta los años bisiestos.

  • El intervalo de horas es de 0 a 23.

  • El intervalo de minutos es de 0 a 59.

  • El intervalo de segundos es de 0 a 61.9(n). Esto permite incluir hasta dos segundos intercalares para mantener la sincronización con la hora sideral.

    Tenga en cuenta que SQL Server no admite segundos intercalares, de modo que los valores de segundos superiores a 59 producirán un error de servidor.

Las implementaciones de las siguientes estructuras existentes de ODBC se han modificado para admitir los nuevos tipos de datos de fecha y hora de SQL Server. Las definiciones, sin embargo, no han cambiado.

  • DATE_STRUCT

  • TIME_STRUCT

  • TIMESTAMP_STRUCT

Hay también dos nuevas estructuras:

  • SQL_SS_TIME2_STRUCT

  • SQL_SS_TIMESTAMPOFFSET_STRUCT

SQL_SS_TIME2_STRUCT

Esta estructura se rellena hasta los 12 bytes en sistemas operativos de 32 bits y 64 bits.

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;

Si timezone_hour es negativo, timezone_minute debe ser negativo o cero. Si timezone_hour es positivo, timezone_minute debe ser positivo o cero. Si timezone_hour es cero, timezone_minute puede tener cualquier valor en el intervalo de -59 a +59.