Język

Dane daty i godziny

W programie SQL Server 2008 wprowadzono oddzielne typy danych dla daty i godziny oraz rozszerzone typy danych o większym zakresie, precyzji i świadomości strefy czasowej. Użyj pakietu NuGet Microsoft.Data.SqlClient, aby uzyskać dostęp do tych typów danych z aplikacji klienckich. Na potrzeby przykładów w tym artykule zaimportuj Microsoft.Data.SqlClient i System.Data w języku C# lub Visual Basic. Typowe typy wartości SQL pozostają w System.Data.SqlTypes.

Wersje programu SQL Server starsze niż SQL Server 2008 miały tylko dwa typy danych do pracy z wartościami daty i godziny: datetime i smalldatetime. Oba te typy danych zawierają zarówno wartość daty, jak i wartość godziny, co utrudnia pracę tylko z wartościami daty lub godziny. Ponadto te typy danych obsługują tylko daty, które występują po wprowadzeniu kalendarza gregoriańskiego w Anglii w 1753 roku. Innym ograniczeniem jest to, że te starsze typy danych nie są świadome strefy czasowej, co utrudnia pracę z danymi pochodzącymi z wielu stref czasowych.

Aby uzyskać więcej informacji na temat typów daty i godziny w programie SQL Server, zobacz Typy danych i funkcje daty i godziny.

Typy danych daty/godziny wprowadzone w programie SQL Server 2008

W poniższej tabeli opisano nowe typy danych daty i godziny.

Typ danych programu SQL Server opis
date Typ date danych ma zakres od 1 stycznia 01 do 31 grudnia 9999 r. z dokładnością 1 dnia. Wartość domyślna to 1 stycznia 1900. Rozmiar pamięci to 3 bajty.
time Typ time danych przechowuje tylko wartości czasu na podstawie zegara 24-godzinnego. Typ time danych ma zakres od 00:00:00.0000000 do 23:59:59.99999999 z dokładnością 100 nanosekund. Wartość domyślna to 00:00:00.00000000 (północ). time Typ danych obsługuje precyzję ułamkowej części sekundy zdefiniowaną przez użytkownika, a rozmiar przechowywania różni się od 3 do 6 bajtów w zależności od określonej precyzji.
datetime2 Typ datetime2 danych łączy zakres i precyzję date typów danych i time w jeden typ danych.

Wartości domyślne i formaty literału ciągu są takie same jak te zdefiniowane w typach danych date i time.
datetimeoffset Typ datetimeoffset danych ma wszystkie funkcje datetime2 z dodatkowym przesunięciem strefy czasowej. Przesunięcie strefy czasowej jest reprezentowane jako [+|-] HH:MM. HH to 2 cyfry z zakresu od 00 do 14, które reprezentują liczbę godzin przesunięcia strefy czasowej. MM to 2 cyfry z zakresu od 00 do 59, które reprezentują liczbę dodatkowych minut przesunięcia strefy czasowej. Formaty czasu są obsługiwane do 100 nanosekund. Obowiązkowy znak + lub — wskazuje, czy przesunięcie strefy czasowej jest dodawane, czy odejmowane z czasu UTC (współrzędna uniwersalna lub średni czas Greenwich) w celu uzyskania czasu lokalnego.

Uwaga

Aby uzyskać więcej informacji na temat używania słowa kluczowego Type System Version , zobacz ConnectionString.

Format daty i kolejność dat

Sposób analizowania wartości daty i godziny przez program SQL Server zależy nie tylko od wersji systemu typów i wersji serwera, ale także domyślnych ustawień języka i formatu serwera. Ciąg daty, który działa dla formatów daty jednego języka, może być nierozpoznawalny, jeśli zapytanie jest wykonywane przez połączenie używające innego języka i ustawienia formatu daty.

Instrukcja Transact-SQL SET LANGUAGE niejawnie ustawia DATEFORMAT, który określa kolejność części daty. Można użyć instrukcji Transact-SQL SET DATEFORMAT w ramach połączenia, aby uściślić wartości dat, porządkując części daty w kolejności MDY, DMY, YDM, YMD, MYD lub DYM.

Jeśli nie określisz żadnego DATEFORMAT dla połączenia, SQL Server używa domyślnego języka skojarzonego z połączeniem. Na przykład ciąg daty „01/02/03” zostanie zinterpretowany jako MDY (2 stycznia 2003 r.) na serwerze z ustawieniem języka angielskiego (Stany Zjednoczone) i jako DMY (1 lutego 2003 r.) na serwerze z ustawieniem języka brytyjskiego angielskiego. Rok jest określany przy użyciu zasady roku granicznego programu SQL Server, która definiuje datę graniczną do przypisania wartości stulecia. Aby uzyskać więcej informacji, zobacz opcja odcięcia dwucyfrowego roku.

Uwaga

Format YDM daty nie jest obsługiwany podczas konwertowania z formatu ciągu na date, time, datetime2lub datetimeoffset.

Aby uzyskać więcej informacji na temat interpretowania danych daty i godziny przez program SQL Server, zobacz Using Date and Time Data (Korzystanie z danych daty i godziny).

Typy i parametry danych daty/godziny

Następujące wyliczenia zostały dodane do SqlDbType w celu wsparcia nowych typów danych dotyczących daty i czasu.

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffset

Aby określić typ danych dla SqlParameter obiektu, użyj jednej z poprzednich SqlDbType wartości wyliczenia.

Uwaga

Nie można ustawić właściwości DbType obiektu SqlParameter na SqlDbType.Date.

Aby określić typ parametru w sposób ogólny, ustaw właściwość DbType na wartość wyliczenia DbType. DbType Następujące wartości obsługują datetime2 i datetimeoffset typy danych:

  • DbType.DateTime2

  • DbType.DateTimeOffset

Te nowe wyliczenia uzupełniają wyliczenia Date, Time i DateTime, które istniały we wcześniejszych wersjach programu .NET Framework.

Typ dostawcy danych w ramach .NET Framework dla obiektu parametru jest wywnioskowany na podstawie typu .NET Framework wartości tego obiektu lub z DbType obiektu parametru. Nie wprowadzono nowych typów danych do obsługi nowych typów danych daty i godziny. W poniższej tabeli opisano mapowania między typami danych daty i godziny programu SQL Server 2008 oraz typami danych CLR.

Typ danych programu SQL Server Typ programu .NET Framework System.Data.SqlDbType System.Data.DbType
date System.DateTime Date Date
time System.TimeSpan Time Time
datetime2 System.DateTime DateTime2 DateTime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
datetime System.DateTime DateTime DateTime
smalldatetime System.DateTime DateTime DateTime

Właściwości parametru SQL

W poniższej tabeli opisano SqlParameter właściwości, które są istotne dla typów danych daty i godziny.

Właściwości opis
IsNullable Pobiera lub ustawia, czy wartość może być nullem. Gdy wysyłasz wartość parametru null do serwera, musisz określić DBNull, a nie null (Nothing w Visual Basic). Aby uzyskać więcej informacji na temat wartości null w bazach danych, zobacz Obsługa wartości null.
Precision Pobiera lub ustawia maksymalną liczbę cyfr używanych do reprezentowania wartości. To ustawienie jest ignorowane dla typów danych daty i godziny.
Scale Pobiera lub ustawia precyzję ułamkową sekundy dla Time, DateTime2i DateTimeOffset. Jeśli nie ustawisz jawnie skali, sterownik wysyła skalę 7. Jawne ustawienie skali na 0 żąda zero cyfr części ułamkowej sekundy.
Size Nie uwzględnia się dla typów danych dotyczących daty i godziny.
Value Pobiera lub ustawia wartość parametru.
SqlValue Pobiera lub ustawia wartość parametru.

Uwaga

Wartości czasu mniejsze niż zero lub większe lub równe 24 godziny będą zgłaszać wartość ArgumentException.

Tworzenie parametrów

Utwórz obiekty SqlParameter za pomocą konstruktora lub wywołaj metodę Add w kolekcji Parameters polecenia. Metoda Add przyjmuje albo argumenty konstruktora, albo istniejący obiekt parametru.

W następnych sekcjach w tym temacie przedstawiono przykłady sposobu określania parametrów daty i godziny. Aby uzyskać dodatkowe przykłady pracy z parametrami, zobacz Konfigurowanie parametrów i typów danych parametrów oraz Parametry DataAdaptera.

Przykład daty

Poniższy fragment kodu pokazuje, jak określić date parametr.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@Date";
parameter.SqlDbType = SqlDbType.Date;
parameter.Value = "2007/12/1";
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Date"
parameter.SqlDbType = SqlDbType.Date
parameter.Value = "2007/12/1"

Przykład czasu

Poniższy fragment kodu pokazuje, jak określić time parametr.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@time";
parameter.SqlDbType = SqlDbType.Time;
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Time"
parameter.SqlDbType = SqlDbType.Time
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay

Przykład daty/godziny2

Poniższy fragment kodu pokazuje, jak określić datetime2 parametr z częściami daty i godziny.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@Datetime2";
parameter.SqlDbType = SqlDbType.DateTime2;
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Datetime2"
parameter.SqlDbType = SqlDbType.DateTime2
parameter.Value = DateTime.Parse("1666-09-02 1:00:00")

Przykład elementu DateTimeOffSet

Poniższy fragment kodu pokazuje, jak określić DateTimeOffset parametr z datą, godziną i przesunięciem strefy czasowej 0.

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@DateTimeOffSet";
parameter.SqlDbType = SqlDbType.DateTimeOffset;
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@DateTimeOffSet"
parameter.SqlDbType = SqlDbType.DateTimeOffset
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00")

AddWithValue

Aby podać parametry, można również wywołać AddWithValue w kolekcji Parameters polecenia, jak pokazano w poniższym fragmencie kodu. Jednak AddWithValue nie pozwala określić DbType lub SqlDbType dla parametru.

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"));
command.Parameters.AddWithValue( _
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"))

Dla tej DateTimeOffset wartości AddWithValue wnioskuje SqlDbType.DateTimeOffset. Aby użyć innego typu danych daty lub czasu SQL Server, ustaw jawnie właściwość parametru SqlDbType.

W poniższej tabeli pokazano, które SqlDbTypes są wnioskowane z typów CLR.

Typ CLR Wnioskowane SqlDbType
DateTime SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

Pobieranie danych daty i godziny

W poniższej tabeli opisano metody używane do pobierania wartości daty i godziny programu SQL Server 2008.

Metoda SqlClient opis
GetDateTime Pobiera określoną wartość kolumny jako DateTime.
GetDateTimeOffset Pobiera określoną wartość kolumny jako DateTimeOffset.
GetProviderSpecificFieldType Zwraca typ, który jest podstawowym typem specyficznym dla dostawcy dla pola. Zwraca te same typy co GetFieldType dla nowych typów daty i godziny.
GetProviderSpecificValue Pobiera wartość określonej kolumny. Zwraca te same typy co GetValue dla nowych typów dat i godzin.
GetProviderSpecificValues Pobiera wartości w określonej tablicy.
GetSqlString Pobiera wartość kolumny w postaci SqlString. Metoda zgłasza, InvalidCastException jeśli nie można wyrazić danych jako SqlString.
GetSqlValue Pobiera domyślne dane kolumny jako SqlDbType. Zwraca te same typy co GetValue dla nowych typów dat i godzin.
GetSqlValues Pobiera wartości w określonej tablicy.
GetString Pobiera wartość kolumny jako ciąg, jeśli wersja systemu typów jest ustawiona na SQL Server 2005. Metoda zgłasza InvalidCastException, jeśli danych nie można wyrazić jako ciągu.
GetTimeSpan Pobiera określoną wartość kolumny jako TimeSpan.
GetValue Pobiera określoną wartość kolumny jako podstawowy typ CLR.
GetValues Pobiera wartości kolumn w tablicy.
GetSchemaTable Zwraca metadane zestawu wyników w DataTable obiekcie.

Uwaga

Nowa data i godzina SqlDbTypes nie są obsługiwane w przypadku kodu, który wykonuje proces w programie SQL Server. Wyjątek zostanie zgłoszony, jeśli jeden z tych typów zostanie przekazany do serwera.

Określanie wartości daty i godziny jako literał.

Typy danych daty i godziny można określić przy użyciu różnych formatów ciągów literału, które program SQL Server następnie ocenia w czasie wykonywania, konwertując je na wewnętrzne struktury daty/godziny. Program SQL Server rozpoznaje dane daty i godziny, które są ujęte w pojedynczy cudzysłów ('). W poniższych przykładach przedstawiono niektóre formaty:

  • Formaty dat alfabetycznych, takie jak 'October 15, 2006'.

  • Formaty dat liczbowych, takie jak '10/15/2006'.

  • Nieseparowane formaty ciągów, takie jak '20061015', które będą interpretowane jako 15 października 2006 r., jeśli używasz standardowego formatu daty ISO.

Wartości czasu mniejsze niż zero lub większe lub równe 24 godziny będą zgłaszać wartość ArgumentException.

Zasoby dokumentacji programu SQL Server

Aby uzyskać więcej informacji na temat pracy z wartościami daty i godziny w programie SQL Server, zobacz następujące artykuły.

Artykuł opis
Typy i funkcje danych daty i godziny (Transact-SQL) Przedstawia omówienie wszystkich typów danych oraz funkcji związanych z datą i godziną w języku Transact-SQL.
Korzystanie z danych daty i godziny Zawiera informacje o typach i funkcjach danych daty i godziny oraz przykłady ich użycia.
Typy danych (Transact-SQL) Opisuje typy danych systemowych w programie SQL Server.

Zobacz też