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.