Udostępnij za pośrednictwem


Dane daty i godziny

Program SQL Server 2008 wprowadził nowe typy danych do obsługi informacji o dacie i godzinie. Nowe typy danych obejmowały oddzielne typy dat i godzin oraz rozszerzone typy danych o większym zakresie, precyzji i rozpoznawaniu stref czasowych. Począwszy od programu .NET Framework w wersji 3.5 z dodatkiem Service Pack (SP) 1, program .NET Framework Dostawca danych dla programu SQL Server (System.Data.SqlClient) zapewnia pełną obsługę wszystkich nowych funkcji aparatu bazy danych programu SQL Server 2008. Aby korzystać z tych nowych funkcji z programem SqlClient, należy zainstalować program .NET Framework 3.5 z dodatkiem SP1 (lub nowszym).

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 magazynu 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 ułamkową drugą precyzję zdefiniowaną przez użytkownika, a rozmiar magazynu różni się od 3 do 6 bajtów na podstawie określonej dokładności.
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 date danych 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 Języka Transact-SQL SET niejawnie ustawia format DATEFORMAT określający kolejność części daty. Instrukcję SET DATEFORMAT Transact-SQL można użyć w połączeniu, aby uściślić wartości dat, porządkując części daty w kolejności MDY, DMY, YMD, YDM, MYD lub DYM.

Jeśli nie określisz żadnego formatu DATEFORMAT dla połączenia, program SQL Server używa domyślnego języka skojarzonego z połączeniem. Na przykład ciąg daty "01.02.02.03" zostanie zinterpretowany jako MDY (2 stycznia 2003) na serwerze z ustawieniem języka Stany Zjednoczone angielskim i jako DMY (1 lutego 2003) na serwerze z ustawieniem języka brytyjskiego języka angielskiego. Rok jest określany przy użyciu reguły roku odcięcia programu SQL Server, która definiuje datę odcięcia dla przypisywania wartości stulecia. Aby uzyskać więcej informacji, zobacz opcja odcięcia dwucyfrowego roku.

Uwaga

Format daty YDM 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 obsługi SqlDbType nowych typów danych daty i godziny.

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffSet

Typ danych SqlParameter elementu można określić przy użyciu jednego z poprzednich SqlDbType wyliczeń.

Uwaga

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

Typ obiektu SqlParameter można również określić w sposób ogólny, ustawiając DbType właściwość SqlParameter obiektu na określoną DbType wartość wyliczenia. Dodano następujące wartości wyliczenia w celu DbType obsługi datetime2 typów danych i datetimeoffset :

  • DbType.DateTime2

  • DbType.DateTimeOffset

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

Typ dostawcy danych programu .NET Framework obiektu parametru jest wywnioskowany z typu .NET Framework wartości obiektu parametru lub z DbType obiektu parametru. System.Data.SqlTypes Nowe typy danych nie zostały wprowadzone 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
data System.DateTime Data Data
time System.TimeSpan Czas Czas
datetime2 System.DateTime Data/godzina2 Data/godzina2
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ść jest dopuszczana do wartości null. Po wysłaniu wartości parametru null do serwera należy określić DBNullwartość , a nie null (Nothing w Visual Basic). Aby uzyskać więcej informacji na temat wartości null bazy 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 liczbę miejsc dziesiętnych, do których część czasowa wartości jest rozpoznawana dla Timewartości , DateTime2i DateTimeOffset. Wartość domyślna to 0, co oznacza, że rzeczywista skala jest wnioskowana z wartości i wysyłana do serwera.
Size Ignorowane dla typów danych 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

Obiekt można utworzyć SqlParameter przy użyciu konstruktora lub dodać go do SqlCommandParameters kolekcji, wywołując Add metodę .SqlParameterCollection Metoda Add będzie przyjmować jako argumenty konstruktora wejściowego lub 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 Configuring Parameters and Parameter Data Types and DataAdapter Parameters (Konfigurowanie parametrów i parametrów parametrów oraz parametrów dataAdapter).

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-02 1:00:00+0");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@DateTimeOffSet"
parameter.SqlDbType = SqlDbType.DateTimeOffSet
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");

AddWithValue

Parametry można również podać przy użyciu AddWithValue metody SqlCommand, jak pokazano w poniższym fragmentcie kodu. AddWithValue Jednak metoda nie zezwala na określenie parametru DbType lub SqlDbType .

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("16660902"));
command.Parameters.AddWithValue( _
    "@date", DateTimeOffset.Parse("16660902"))

Parametr @date może mapować na datetyp danych , datetimelub datetime2 na serwerze. Podczas pracy z nowymi datetime typami danych należy jawnie ustawić właściwość parametru SqlDbType na typ danych wystąpienia. Użycie Variant lub niejawne podanie wartości parametrów może powodować problemy ze zgodnością wsteczną z typami datetime danych i smalldatetime .

W poniższej tabeli przedstawiono typy CLR, które SqlDbTypes są wnioskowane:

Typ CLR Wywnioskowany typ bazy danych SqlDb
DateTime SqlDbType.DateTime
przedział_czasu 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.

SqlClient, metoda opis
GetDateTime Pobiera określoną wartość kolumny jako DateTime strukturę.
GetDateTimeOffset Pobiera określoną wartość kolumny jako DateTimeOffset strukturę.
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 jako .SqlString Występuje InvalidCastException , jeśli nie można wyrazić danych jako SqlString.
GetSqlValue Pobiera dane kolumn jako domyślne 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. Występuje InvalidCastException , jeśli nie można wyrazić danych jako ciągu.
GetTimeSpan Pobiera określoną wartość kolumny jako TimeSpan strukturę.
GetValue Pobiera określoną wartość kolumny jako podstawowy typ CLR.
GetValues Pobiera wartości kolumn w tablicy.
GetSchemaTable Zwraca element opisujący DataTable metadane zestawu wyników.

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łów

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 oblicza 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) Zawiera omówienie wszystkich typów danych i funkcji daty i godziny języka 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ż