Udostępnij przez


Obsługa typu danych dla ulepszenia ODBC Data/Godzina

W tym temacie przedstawiono informacje o typach ODBC, które obsługują SQL Server Data i czas typów danych.

Mapowanie typu danych, parametry i Resultsets

Oprócz typów danych ODBC (SQL_TYPE_TIMESTAMP i SQL_TIMESTAMP) wymagane są dwa nowe typy danych w SQL Server Macierzysta ODBC klient do udostępnienia nowe typy serwerów:

  • SQL_SS_TIME2

  • SQL_TIMESTAMPOFFSET

W poniższej tabela przedstawiono mapowanie pełny typ serwera.Powiadomienie, że niektóre komórki w tabela zawiera dwa wpisy; w takich przypadkach pierwszą jest wartość ODBC 3.0, a drugi jest wartością ODBC 2.0.

Typ danych programu SQL Server

Typ danych SQL

Wartość

Data i godzina

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

93 (sql.h)

11 (sqlext.h)

Smalldatetime

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

93 (sql.h)

11 (sqlext.h)

Data

SQL_TYPE_DATE

SQL_DATE

91 (sql.h)

9 (sqlext.h)

Godzina

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)

Poniższa lista zawiera odpowiedniej struktury i typy ODBC C.Ponieważ ODBC nie zezwala na C typy zdefiniowane przez sterownik, SQL_C_BINARY jest używany do czas i datetimeoffset jako binarne struktur.

Typ danych SQL

Układ pamięci

Domyślny typ danych C

Wartość (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)

Po określeniu SQL_C_BINARY wiązanie będą wykonywane sprawdzanie wyrównanie i zgłosił błąd wyrównanie niepoprawne.SQLSTATE dla tego błędu będą IM016, z komunikatem "Niepoprawna struktura wyrównanie".

Formaty danych: Ciągi i literały

W poniższej tabela przedstawiono mapowania między SQL Server typy danych, typy danych ODBC, a literały ciągów znaków ODBC.

Typ danych programu SQL Server

Typ danych ODBC

Format ciąg dla konwersji klient

Data i godzina

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

hh: mm: "rrrr mm-dd ss [.999]"

SQL Server obsługuje maksymalnie trzy ułamkowe drugiej cyfry daty/godziny.

Smalldatetime

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

"hh:hh:ss rrrr mm-dd"

Ten typ danych ma dokładnością do jednej minuty.Składnik sekund będzie zero w danych wyjściowych i ma być zaokrąglana przez serwer na wejściu.

Data

SQL_TYPE_DATE

SQL_DATE

"rrrr mm-dd"

Godzina

SQL_SS_TIME2

"hh: mm: ss [.9999999]"

Opcjonalnie można określić ułamków sekund, przy użyciu do siedmiu cyfr.

Datetime2

SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP

hh: mm: "rrrr mm-dd ss [0,9999999]"

Opcjonalnie można określić ułamków sekund, przy użyciu do siedmiu cyfr.

DatetimeOFFSET

SQL_SS_TIMESTAMPOFFSET

hh: mm: "rrrr mm-dd ss [.9999999] +/-gg: mm"

Opcjonalnie można określić ułamków sekund, przy użyciu do siedmiu cyfr.

Dla data nie istnieją żadne zmiany w sekwencji unikowych ODBC / czas literałów.

Ułamków sekund w wynikach zawsze używać kropki (.), zamiast dwukropka (:)).

Ciąg wartości zwracanych do aplikacji zawsze mają tę samą długość dla danej kolumna.Rok, miesiąc, dzień, godzin, minut i drugiej części są wypełniane z wiodącymi zerami z ich maksymalną szerokość i jest pojedynczy odstęp między datą i czas daty czas wartości.Istnieje także jedną spację między czas i przesunięcie wartości datetimeoffset timezone.Przesunięcie timezone zawsze poprzedzone znakiem; Jeśli przesunięcie wynosi zero, ten znak jest znakiem plus (+).Ułamków sekund są wypełniane z końcowe zera w razie potrzeby do określonych precyzji kolumna.W przypadku kolumn typu Data/Godzina istnieją trzy cyfry ułamków sekund.Dla kolumn, smalldatetime są cyframi nie ułamków sekund, a sekundy będzie zawsze równa zero.

Pusty ciąg nie jest prawidłową data/czas literał i nie reprezentuje wartość NULL.Podjęto próbę konwersji pusty ciąg znaków do wartości data/godziny spowoduje błąd SQLState 22018 i komunikat "nieprawidłowy znak wartości dla specyfikacji rzutowania".

Podczas konwersji z parametry ciąg będzie oczekiwać, że ciągi znaków w tym samym formacie, z wyjątkiem znaku timezone godzin zero i zero minut może być albo plus lub minus i końcowe zera są dozwolone dla ułamków sekund maksymalnie 9 cyfr.Składnik czas mogą kończyć się z punktem dziesiętnym i nie cyfr ułamków sekund.

Obecnie sterownik pozwala dodatkowe światło wokół znaki interpunkcyjne i odstęp między przesunięcie czas i timezone jest opcjonalne.Jednak to mogą ulec zmianie w przyszłych wydaniach, aplikacje nie powinna polegać na bieżące zachowanie.

Formaty danych: Struktury danych

W strukturach opisane poniżej ODBC określa następujące ograniczenia, które są pobierane z kalendarza gregoriańskiego:

  • Miesiąc zakres wynosi od 1 do 12.

  • Dzień pole zakres to 1 do liczby dni w miesiącu i muszą być zgodne z pole rok i miesiąc, biorąc pod uwagę przestępnego.

  • Godzina zakres wynosi od 0 do 23.

  • Minuta zakres wynosi od 0 do 59.

  • Sekund zakres wynosi od 0 do 61.9(n).Dzięki temu do dwóch sekund przestępnych zachować synchronizację z czas sideral.

    Należy zauważyć, że SQL Server nie zezwala na przestępnych sekund, co drugi większa niż 59 wartości spowoduje, że wystąpił błąd serwera.

Zmieniono do obsługi nowych implementacji dla następujących istniejących strukturach ODBC SQL Server Data i godzina typów danych. Definicje, jednak nie zostały zmienione.

  • DATE_STRUCT

  • TIME_STRUCT

  • TIMESTAMP_STRUCT

Istnieją także dwa nowe strukturach:

  • SQL_SS_TIME2_STRUCT

  • SQL_SS_TIMESTAMPOFFSET_STRUCT

SQL_SS_TIME2_STRUCT

Ta struktura jest nowa w SQL Server 2008 i jest wypełniane na 12 bajtów w 32-bitowe i 64-bitowych systemach operacyjnych.

typedef struct tagSS_TIME2_STRUCT {
   SQLUSMALLINT hour;
   SQLUSMALLINT minute;
   SQLUSMALLINT second;
   SQLUINTEGER fraction;
} SQL_SS_TIME2_STRUCT;

SQL_SS_TIMESTAMPOFFSET_STRUCT

Ta struktura jest nowa w SQL Server 2008:

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;

Jeśli timezone_hour jest liczbą ujemną, timezone_minute musi być ujemna lub zero. Jeśli timezone_hour jest liczbą dodatnią, timezone_minute musi mieć wartość dodatnią lub zerem. Jeśli timezone_hour jest równe zero, to stimezone_minute może mieć dowolną wartość z zakres-59 za pośrednictwem +59.

See Also

Concepts