Suporte a tipos de dados para aprimoramentos de data/hora do ODBC
Este tópico fornece informações sobre tipos de ODBC com suporte a tipos de dados de data e hora do SQL Server.
Mapeamento de tipo de dados em parâmetros e conjuntos de resultados
Além dos tipos de dados ODBC (SQL_TYPE_TIMESTAMP e SQL_TIMESTAMP), dois novos tipos de dados foram adicionados ao ODBC do SQL Server Native Client para expor os novos tipos de servidor:
SQL_SS_TIME2
SQL_SS_TIMESTAMPOFFSET
A tabela seguinte mostra o mapeamento completo de tipo do servidor. Observe que algumas células da tabela contêm duas entradas; nestes casos, a primeira é o valor ODBC 3.0 e a segunda é o valor ODBC 2.0.
Tipo de dados do SQL Server |
Tipo de dados 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) |
A tabela seguinte lista as estruturas correspondentes e os tipos ODBC C. Como o ODBC não permite tipos C definidos pelo driver, SQL_C_BINARY é usado para time e datetimeoffset como estruturas binárias.
Tipo de dados SQL |
Layout de memória |
Tipo de dados C padrão |
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_SS_TIME2 SQL_C_BINARY (ODBC 3.5 e anterior) |
0x4000 (sqlncli.h) SQL_BINARY (-2) |
SQL_SS_TIMESTAMPOFFSET |
SQL_SS_TIMESTAMPOFFSET_STRUCT |
SQL_C_SS_TIMESTAMPOFFSET SQL_C_BINARY (ODBC 3.5 e anterior) |
0x4001 (sqlncli.h) SQL_BINARY (-2) |
Quando a associação SQL_C_BINARY é especificada, a verificação do alinhamento será executada e um erro relatado para alinhamento incorreto. O SQLSTATE para esse erro será IM016, com a mensagem "Alinhamento de estrutura incorreto".
Formatos de dados: cadeias e literais
A tabela seguinte mostra os mapeamentos entre tipos de dados do SQL Server, tipos de dados ODBC e os literais da cadeia de caracteres ODBC.
Tipo de dados do SQL Server |
Tipo de dados ODBC |
Formato de cadeia de caracteres para conversões do cliente |
---|---|---|
Datetime |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
'aaaa-mm-dd hh:mm:ss[.999]' O SQL Server oferece suporte a até três dígitos de fração de segundo para Datetime. |
Smalldatetime |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
'aaaa-mm-dd hh:hh:ss' Este tipo de dados tem precisão de um minuto. O componente de segundos será zero na saída, sendo arredondado pelo servidor na entrada. |
Date |
SQL_TYPE_DATE SQL_DATE |
'aaaa-mm-dd' |
Time |
SQL_SS_TIME2 |
'hh:mm:ss[.9999999]' Opcionalmente, podem ser especificadas frações de segundo usando até sete dígitos. |
Datetime2 |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
'aaaa-mm-dd hh:mm:ss[.9999999]' Opcionalmente, podem ser especificadas frações de segundo usando até sete dígitos. |
DatetimeOFFSET |
SQL_SS_TIMESTAMPOFFSET |
'aaaa-mm-dd hh:mm:ss[.9999999] +/- hh:mm' Opcionalmente, podem ser especificadas frações de segundo usando até sete dígitos. |
Não há nenhuma alteração às sequências de escape de ODBC para literais de data/hora.
As frações de segundo nos resultados sempre usam um ponto (.), em vez de dois-pontos (:).
Valores da cadeia de caracteres retornados aos aplicativos têm sempre o mesmo comprimento para uma determinada coluna. Componentes de ano, mês, dia, hora, minuto e segundo são preenchidos com zeros à esquerda até sua largura máxima, e há um espaço entre date e time nos valores de datetime. Também há um espaço entre o deslocamento de time e timezone em um valor de datetimeoffset. Um deslocamento de timezone sempre é precedido por um sinal; quando o deslocamento é zero, este sinal é de mais (+). As frações de segundos são preenchidas com zeros à direita, se necessário, até a precisão definida para a coluna. Para colunas do tipo datetime, há três dígitos para frações de segundo. Para colunas do tipo smalldatetime, não há nenhum dígito de fração de segundo e os segundos sempre serão zero.
Uma cadeia de caracteres vazia não é um literal de data/hora válido e não representa um valor NULL. Uma tentativa de conversão de uma cadeia de caracteres vazia para um valor de data/hora resultará em erro SQLState 22018 e a mensagem "Valor de caractere inválido para a especificação de difusão".
As conversões de parâmetros de cadeia de caracteres esperarão caracteres no mesmo formato, com exceções de que o sinal de um fuso horário com zero horas e zero minutos podem ser mais ou menos, e zeros à direita são permitidos para frações de segundos com, no máximo, nove dígitos. Um componente de hora pode terminar com um ponto decimal e não ter dígitos de fração de segundo.
Atualmente, o driver permite espaço em branco adicional ao redor de caracteres de pontuação e o espaço entre deslocamento de time e timezone é opcional. Porém, isto pode ser alterado em uma versão futura; aplicativos não devem confiar no comportamento atual.
Formatos de dados: estruturas de dados
Nas estruturas descritas a seguir, ODBC especifica as seguintes restrições, que são obtidas do calendário gregoriano:
O intervalo de meses é de 1 a 12.
O intervalo do campo de dias é de 1 ao número de dias do mês e deve ser coerente com os campos de ano e mês, levando em conta os anos bissextos.
O intervalo de horas é de 0 a 23.
O intervalo de minutos é de 0 a 59.
O intervalo de segundos é 0 por 61,9(n). Isso permite até dois segundos intercalares para manter a sincronização com a hora sideral.
Observe que o SQL Server não permite segundos intercalados. Dessa forma, valores de segundo maiores que 59 causarão um erro de servidor.
Foram modificadas as implementações das seguintes estruturas de ODBC existentes para dar suporte aos novos tipos de dados date e time do SQL Server. Porém, as definições não foram alteradas.
DATE_STRUCT
TIME_STRUCT
TIMESTAMP_STRUCT
Também há duas novas estruturas:
SQL_SS_TIME2_STRUCT
SQL_SS_TIMESTAMPOFFSET_STRUCT
SQL_SS_TIME2_STRUCT
Esse struct é preenchido com até 12 bytes nos sistemas operacionais de 32 e 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;
Se o timezone_hour for negativo, o timezone_minute deverá ser negativo ou zero. Se o timezone_hour for positivo, o timezone_minute deve ser positivo ou zero. Se o timezone_hour for zero, o timezone_minute pode ter qualquer valor no intervalo -59 por +59.