Partilhar via


Conversões do tipo de dados datetime do SQL para C

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)

A tabela a seguir lista os problemas a serem considerados ao converter de SQL Server tipos de data/hora para tipos C.

Conversões

SQL_C_DATE SQL_C_TIME SQL_C_TIMESTAMP SQL_C_SS_TIME2 SQL_C_SS_TIMESTAMPOFFSET SQL_C_BINARY SQL_C_CHAR SQL_C_WCHAR
SQL_CHAR 2,3,4,5 2,3,6,7,8 2,3,9,10,11 2,3,6,7 2,3,9,10,11 1 1 1
SQL_WCHAR 2,3,4,5 2,3,6,7,8 2,3,9,10,11 2,3,6,7 2,3,9,10,11 1 1 1
SQL_TYPE_DATE OK 12 13 12 13,23 14 16 16
SQL_SS_TIME2 12 8 15 OK 10,23 17 16 16
SQL_TYPE_TIMESTAMP 18 7,8 OK 7 23 19 16 16
SQL_SS_TIMESTAMPOFFSET 18,22 7,8,20 20 7,20 OK 21 16 16

Legenda dos símbolos

Símbolo Significado
OK Nenhum problema na conversão.
1 As regras anteriores a SQL Server 2008 (10.0.x) se aplicam.
2 Os espaços à esquerda e à direita são ignorados.
3 A cadeia de caracteres é analisada em date, time, timezone ou timezoneoffset e permite até nove dígitos para segundos fracionários. Caso timezoneoffset seja analisado, a hora é convertida no fuso horário do cliente. Se ocorrer um erro durante essa conversão, um registro de diagnóstico será gerado com SQLSTATE 22018 e a mensagem "Estouro de campo datetime".
4 Caso o valor não seja date, timestamp ou timestampoffset válido, um registro de diagnóstico é gerado com SQLSTATE 22018 e a mensagem "Valor de caractere inválido para a especificação de difusão".
5 Caso a hora seja diferente de zero, um registro de diagnóstico é gerado com SQLSTATE 01S07 e a mensagem "Truncamento fracionário".
6 Caso o valor não seja time, timestamp ou timestampoffset válido, um registro de diagnóstico é gerado com SQLSTATE 22018 e a mensagem "Valor de caractere inválido para a especificação de difusão".
7 O componente de data é ignorado.
8 Caso os segundos fracionários sejam diferentes de zero, um registro de diagnóstico é gerado com SQLSTATE 01S07 e a mensagem "Truncamento fracionário".
9 Caso o valor não seja date, time, timestamp ou timestampoffset válido, um registro de diagnóstico é gerado com SQLSTATE 22018 e a mensagem "Valor de caractere inválido para a especificação de difusão".
10 Caso o valor não seja uma hora válida, o componente de data é definido como a data do cliente atual.
11 Caso o valor seja uma data válida, a hora é definida como zero.
12 Será gerado um registro de diagnóstico com SQLSTATE 07006 e a mensagem "Violação do atributo de tipo de dados restrito".
13 A hora é definida como zero.
14 Caso o buffer não seja grande o suficiente para acomodar SQL_DATE_STRUCT, um registro de diagnóstico é gerado com SQLSTATE 22003 e a mensagem "Valor numérico fora do intervalo".
15 A data é definida como a data atual do cliente.
16 Caso o buffer não seja grande o suficiente para acomodar o valor da cadeia de caracteres convertida, e sim apenas segundos fracionários, ocorre o truncamento, e um registro de diagnóstico é gerado com SQLSTATE 01004 e a mensagem "Dados de cadeia de caracteres truncados à direita". Caso o buffer não seja grande o suficiente para acomodar o valor da cadeia de caracteres sem truncamento dos componentes de data, hora ou deslocamento, um registro de diagnóstico é gerado com SQLSTATE 22003 e a mensagem "Valor numérico fora do intervalo". Observe que para date e timestampoffset, SQLSTATE 01004 não é possível porque a parte mais à direita da cadeia de caracteres convertida não contém segundos fracionários. Dessa forma, qualquer truncamento causa a perda de dados.
17 Caso buffer não seja grande o suficiente para acomodar um SQL_SS_TIME2_STRUCT, um registro de diagnóstico é gerado com SQLSTATE 22003 e a mensagem "Valor numérico fora do intervalo".
18 Caso a hora seja diferente de zero, um registro de diagnóstico é gerado com SQLSTATE 01S07 e a mensagem "Truncamento fracionário".
19 Se o tipo de servidor for datetime ou smalldatetime, o valor corresponderá ao formato com fio TDS e será um valor de quatro bytes para smalldatetime e de oito para datetime.

Caso o tipo de servidor seja datetime2, o valor é retornado como SQL_TIMESTAMP_STRUCT. Caso o buffer não seja grande o suficiente para acomodar o valor retornado, um registro de diagnóstico é gerado com SQLSTATE 22003 e a mensagem "Valor numérico fora do intervalo".
20 A hora é convertida para o fuso horário do cliente. Se ocorrer um erro durante esta conversão, um registro de diagnóstico será gerado com SQLSTATE 22008 e a mensagem "Estouro do campo datetime".
21 Caso o buffer seja grande o suficiente para acomodar um SQL_SS_TIMESTAMPOFFSET_STRUCT, o valor é retornado como SQL_SS_TIMESTAMPOFFSET_STRUCT. Caso contrário, um registro de diagnóstico é gerado com SQLSTATE 22003 e a mensagem "Valor numérico fora do intervalo".
22 O valor é convertido no fuso horário do cliente antes da extração da data. Isso proporciona consistência em relação às demais conversões com tipos timestampoffset. Se ocorrer um erro durante esta conversão, um registro de diagnóstico será gerado com SQLSTATE 22008 e a mensagem "Estouro do campo datetime". Isso pode resultar em uma data diferente do valor obtido pelo truncamento simples.

A tabela neste tópico descreve conversões entre o tipo retornado para o cliente e o tipo na associação. Para parâmetros de saída, se o tipo de servidor especificado em SQLBindParameter não corresponder ao tipo real no servidor, uma conversão implícita será executada pelo servidor e o tipo retornado ao cliente corresponderá ao tipo especificado por meio de SQLBindParameter. Isso pode levar a resultados de conversão inesperados quando as regras de conversão do servidor são diferentes daquelas listadas na tabela anterior. Por exemplo, quando uma data padrão deve ser fornecida, SQL Server usa 1900-1-1, em vez da data atual.

Consulte Também

Aprimoramentos de data e hora (ODBC)