Compartir a través de


Conversiones de C a SQL

En este tema se enumeran las cuestiones que se han de tener en cuenta al convertir de tipos C a tipos de fecha y hora de SQL Server.

Las conversiones descritas en la tabla siguiente se aplican a conversiones realizadas en el cliente. En los casos en que el cliente especifica para un parámetro una precisión de fracciones de segundo diferente de la definida en el servidor, la conversión puede llegar a realizarse en el cliente pero el servidor devolverá un error cuando se llame a SQLExecute o SQLExecuteDirect. Concretamente, ODBC trata cualquier truncamiento de fracciones de segundo como un error, mientras que SQL Server realiza un redondeo; por ejemplo, el redondeo se produce cuando se pasa de datetime2(6) a datetime2(2). Los valores de las columnas datetime se redondean a la fracción 1/300 de segundo, mientras que para las columnas smalldatetime, el servidor establece los segundos en cero.

SQL_TYPE_DATE

SQL_TYPE_TIME

SQL_SS_TIME2

SQL_TYPE_TIMESTAMP

SQL_SS_TIMESTAMPOFFSET

SQL_CHAR

SQL_WCHAR

SQL_C_DATE

1

-

-

1,6

1,5,6

1,13

1,13

SQL_C_TIME

-

1

1

1,7

1,5,7

1,13

1,13

SQL_C_BINARY (SQL_SS_TIME2_STRUCT)

N/A

N/A

1,10,11

N/A

N/A

N/A

N/A

SQL_C_TYPE_TIMESTAMP

1,2

1,3,4

1,4,10

1,10

1,5,10

1,13

1,13

SQL_C_BINARY(SQL_SS_TIMESTAMPOFFSET_STRUCT)

N/A

N/A

N/A

N/A

1,10,11

N/A

N/A

SQL_C_CHAR/SQL_WCHAR (date)

9

9

9

9,6

9,5,6

N/A

N/A

SQL_C_CHAR/SQL_WCHAR (time2)

9

9,3

9,10

9,7,10

9,5,7,10

N/A

N/A

SQL_C_CHAR/SQL_WCHAR (datetime)

9,2

9,3,4

9,4,10

9,10

9,5,10

N/A

N/A

SQL_C_CHAR/SQL_WCHAR (datetimeoffset)

9,2,8

9,3,4,8

9,4,8,10

9,8,10

9,10

N/A

N/A

SQL_C_BINARY(SQL_DATE_STRUCT)

1,11

N/A

N/A

N/A

N/A

N/A

N/A

SQL_C_BINARY(SQL_TIME_STRUCT)

N/A

N/A

N/A

N/A

N/A

N/A

N/A

SQL_C_BINARY(SQL_TIMESTAMP_STRUCT)

N/A

N/A

N/A

N/A

N/A

N/A

N/A

Clave de los símbolos

Símbolo

Significado

-

No se admite la conversión. Se genera un registro de diagnóstico con SQLSTATE 07006 y el mensaje "Infracción del atributo de tipo de datos restringido".

1

Si los datos proporcionados no son válidos, se genera un registro de diagnóstico con SQLSTATE 22007 y el mensaje "Formato de fecha y hora no válido".

2

Los campos de hora deben ser cero o, de lo contrario, se genera un registro de diagnóstico con SQLSTATE 22008 y el mensaje "Truncamiento fraccionario".

3

Las fracciones de segundo deben ser cero o, de lo contrario, se genera un registro de diagnóstico con SQLSTATE 22008 y el mensaje "Truncamiento fraccionario".

4

Se omite el componente de fecha.

5

La zona horaria se establece en el valor de zona horaria del cliente.

6

La hora se establece en cero.

7

La fecha se establece en la fecha actual.

8

La hora se convierte de la zona horaria del cliente a UTC. Si se produce un error durante esta conversión, se genera un registro de diagnóstico con SQLSTATE 22008 y el mensaje "Desbordamiento del campo DateTime".

9

La cadena se analiza y se convierte en un valor date, datetime, datetimeoffset o time, dependiendo del primer carácter de puntuación encontrado y de la presencia de otros componentes. A continuación, la cadena se convierte al tipo de destino, siguiendo las reglas de la tabla anterior para el tipo de origen detectado por este proceso. Si se detecta un error mientras se analizan los datos, se genera un registro de diagnóstico con SQLSTATE 22018 y el mensaje "Valor de carácter no válido para especificación cast". Para los parámetros datetime y smalldatetime, si el año está fuera del intervalo admitido por estos tipos, se genera un registro de diagnóstico con SQLSTATE 22007 y el mensaje "Formato de fecha y hora no válido".

Para datetimeoffset, el valor debe estar dentro del intervalo después de la conversión a UTC, aunque no se solicite ninguna conversión a UTC. Esto se debe a que TDS y el servidor siempre normalizan la hora en valores datetimeoffset para UTC, de modo que el cliente debe comprobar que los componentes de hora están dentro del intervalo admitido después de la conversión a UTC. Si el valor no está dentro del intervalo UTC admitido, se genera un registro de diagnóstico con SQLSTATE 22007 y el mensaje "Formato de fecha y hora no válido".

10

Si se produce un truncamiento con pérdida de datos, se genera un registro de diagnóstico con SQLSTATE 22008 y el mensaje "Formato de hora no válido". Este error también se produce si el valor está fuera del intervalo que puede representarse mediante el intervalo UTC utilizado por el servidor.

11

Si la longitud de bytes de los datos no coincide con el tamaño de la estructura requerida por el tipo SQL, se genera un registro de diagnóstico con SQLSTATE 22003 y el mensaje "Valor numérico fuera del intervalo".

12

Si la longitud de bytes de los datos es 4 u 8, los datos se envían al servidor en formato datetime o smalldatetime TDS sin procesar. Si la longitud de bytes de los datos coincide exactamente con el tamaño de SQL_TIMESTAMP_STRUCT, los datos se convierten al formato TDS para datetime2.

13

Si se produce un truncamiento con pérdida de datos, se genera un registro de diagnóstico con SQLSTATE 22001 y el mensaje "Cadena truncada por la derecha".

El número de dígitos de fracciones de segundo (la escala) se determina en función del tamaño de la columna de destino, de acuerdo con la tabla siguiente:

TipoEscala supuesta 0Escala supuesta 1..9
SQL_C_TYPE_TIMESTAMP1921..29

Sin embargo, para SQL_C_TYPE_TIMESTAMP, si las fracciones de segundo se pueden representar con tres dígitos sin perder datos y el tamaño de columna es 23 o superior, se generan exactamente tres dígitos de fracciones de segundo. Este comportamiento asegura la compatibilidad con versiones anteriores para aplicaciones desarrolladas utilizando controladores ODBC anteriores.

Si el tamaño de columna es superior al intervalo de la tabla, se supone una escala de 9. Esta conversión debe permitir hasta nueve dígitos de fracciones de segundo, el máximo permitido por ODBC.

Un tamaño de columna igual a cero implica un tamaño ilimitado de los tipos de caracteres de longitud variable en ODBC (9 dígitos, a menos que sea aplicable la regla de 3 dígitos para SQL_C_TYPE_TIMESTAMP). Especificar un tamaño de columna igual a cero con un tipo de caracteres de longitud fija es un error.

N/A

Se mantiene el comportamiento de la versión actual de SQL Server 2005 y de versiones anteriores.