Obsługa typu danych ODBC Data/Godzina ulepszenia
Ten temat zawiera informacje o typach ODBC, które obsługują SQL Server data i czas danych typów.
Mapowanie typu danych parametrów i zestawy wyników
Typy oprócz ODBC (SQL_TYPE_TIMESTAMP i SQL_TIMESTAMP), dwa nowe dane są wymagane typy danych SQL Server macierzystego ODBC klienta do udostępnienia nowych typów serwera:
SQL_SS_TIME2
SQL_TIMESTAMPOFFSET
W poniższej tabela przedstawiono mapowanie kompletny typ serwera.Należy zauważyć, że niektóre komórki tabela zawiera dwa wpisy; w tych przypadkach wartość ODBC 3.0 jest pierwszym i drugim jest wartością ODBC 2.0.
Typ danych programu SQL Server |
Typ danych SQL |
Wartość |
---|---|---|
Datetime |
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) |
W poniższej tabela przedstawiono odpowiednich struktur i typy ODBC C.Ponieważ ODBC nie zezwalają na c typy zdefiniowane przez sterownik, SQL_C_BINARY jest używana do czas i dataczasprzesunięcia 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 powiązanie SQL_C_BINARY wyrównanie będzie sprawdzany i zgłosił błąd wyrównania niepoprawne.SQLSTATE dla tego błędu będzie IM016, z komunikatem "Niepoprawna struktura wyrównanie".
Formaty danych: Ciągi i literałów
W poniższej tabela przedstawiono mapowania między SQL Server typów danych i typy danych ODBC, Literały ciąg ODBC.
Typ danych programu SQL Server |
Typ danych ODBC |
Format ciągu dla konwersji klient |
---|---|---|
Datetime |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
"rrrr mm-dd ss [.999]" SQL Serverobsługuje maksymalnie trzy cyfry drugiego ułamkowe Datetime. |
Smalldatetime |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
"rrrr mm-dd hh:hh:ss" Ten typ danych ma dokładność jedną minutę.Składnik sekund będzie zero w danych wyjściowych i zaokrąglone na wejście przez serwer. |
Data |
SQL_TYPE_DATE SQL_DATE |
"rrrr mm-dd" |
Godzina |
SQL_SS_TIME2 |
"ss [.9999999]" Opcjonalnie można określić ułamków sekund do siedmiu cyfry. |
Datetime2 |
SQL_TYPE_TIMESTAMP SQL_TIMESTAMP |
"rrrr mm-dd ss [0,9999999]" Opcjonalnie można określić ułamków sekund do siedmiu cyfry. |
DatetimeOFFSET |
SQL_SS_TIMESTAMPOFFSET |
"rrrr mm-dd: ss [.9999999] +/-gg: mm" Opcjonalnie można określić ułamków sekund do siedmiu cyfry. |
Żadne zmiany nie zostały do sekwencji unikowych ODBC Data /czas literałów.
Ułamków sekund w wyniki kropka (.), należy zawsze używać zamiast dwukropka (:)).
Ciąg wartości zwracanych do aplikacji są zawsze tej samej długości, dla danej kolumna.Roku, miesiąc, dzień, czas, minutę i drugiej części są wypełniane zer ich maksymalną szerokość i jednego miejsca między data i godziną wartości datetime.Istnieje również jedną spację między czas i strefa czasowa przesunięcie w wartości datetimeoffset.Przesunięcie timezone jest zawsze poprzedzone znakiem; Przesunięcie wynosi zero, to znak jest znakiem plus (+).Końcowe zera w razie potrzeby do określonych precyzji kolumna są wypełniane ułamków sekund.Istnieją trzy cyfry ułamków sekund dla kolumn typu Data/Godzina.Smalldatetime kolumn są nie ułamków sekund cyfry i sekund będzie zawsze równa zero.
Pusty ciąg nie jest prawidłową data/czas literał i nie reprezentuje wartość NULL.Próba przekonwertować pusty ciąg na datę /czas wartość spowoduje błąd SQLState 22018 i komunikat "nieprawidłowy znak wartość dla specyfikacji".
Konwersje z parametry ciąg będzie poszukiwać ciągi w tym samym formacie, z wyjątkami, które mogą być znak timezone godzinach zero i zero minut plus lub minus i końcowe zera są dozwolone dla ułamków sekund maksymalnie 9 cyfr.A czas składnika można zakończyć z punktem dziesiętnym i nie cyfr ułamków sekund.
Obecnie, sterownik pozwala dodatkowy odstęp wokół znaków interpunkcyjnych i odstęp między czas i czasprzesunięcie strefy jest opcjonalne.Jednakże może to zmienić w przyszłości; aplikacje nie powinny polegać na bieżące zachowanie.
Formaty danych: Struktury danych
ODBC określa następujące ograniczenia, które są pobierane z kalendarza gregoriańskiego struktur opisanych poniżej:
Miesiąc zakres wynosi od 1 do 12.
Dzień zakres wynosi od 1 do liczby dni w miesiącu i muszą być zgodne z pole rok i miesiąc, biorąc pod uwagę przestępnego.
Godzinę zakres wynosi od 0 do 23.
MINUTE 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, więc drugiej wartości większe od 59 będzie powodować błąd serwera.
Implementacje dla następujących istniejących strukturach ODBC zostały zmodyfikowane do obsługi nowych SQL Server data i czas danych typów.Definicje, jednak nie uległy zmianie.
DATE_STRUCT
TIME_STRUCT
TIMESTAMP_STRUCT
Istnieją także dwa nowe struktur:
SQL_SS_TIME2_STRUCT
SQL_SS_TIMESTAMPOFFSET_STRUCT
SQL_SS_TIME2_STRUCT
Ta struktura jest uzupełniony 12 bajtów w 32-bitowych 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
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 ujemna, timezone_minute musi być ujemna lub zero.Jeśli timezone_hour jest dodatnia, timezone_minute musi być dodatnią lub zero.Jeśli timezone_hour wynosi zero, to stimezone_minute może mieć dowolną wartość z zakres od -59 do + 59.