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
, datetime2
lub 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ą Date
wyliczenia , Time
i 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 Time wartości , DateTime2 i 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 date
typ danych , datetime
lub 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. |