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.