Udostępnij za pomocą


datetime2 (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Definiuje datę połączoną z godziną dnia opartą na zegarze 24-godzinnym. datetime2 można uznać za rozszerzenie istniejącego typu daty/godziny , który ma większy zakres dat, większą domyślną precyzję ułamkową i opcjonalną precyzję określoną przez użytkownika.

Opis datetime2

Property Value
Syntax datetime2 [ (precyzja ułamkowa sekund) ]
Usage DECLARE @MyDatetime2 datetime2(7);
CREATE TABLE Table1 (Column1 datetime2(7));
Domyślny format literału ciągu

(używane w przypadku klienta na poziomie podrzędnym)
yyyy-MM-dd HH:mm:ss[.nnnnnnn]

Aby uzyskać więcej informacji, zobacz Zgodność z poprzednimi wersjami dla klientów na poziomie starszym w dalszej części tego artykułu.
Zakres dat 0001-01-01 za pośrednictwem 9999-12-31

1 stycznia 1 CE do 31 grudnia 9999 CE
Zakres czasu 00:00:00 za pośrednictwem 23:59:59.9999999
Zakres przesunięcia strefy czasowej None
Zakresy pierwiastków yyyy jest 4-cyfrową liczbą, od 0001 do 9999, która reprezentuje rok.

MM jest dwucyfrową liczbą z zakresu od 01 do 12, która reprezentuje miesiąc w określonym roku.

ddto dwucyfrowa liczba, od do 01 w zależności od 31 miesiąca, który reprezentuje dzień określonego miesiąca.

HH jest dwucyfrową liczbą z zakresu od 00 do 23, która reprezentuje godzinę.

mm jest dwucyfrową liczbą z zakresu od 00 do 59, która reprezentuje minutę.

ss jest dwucyfrową liczbą z zakresu od 00 do 59, która reprezentuje drugą.

n* jest liczbą zero-do siedmiu cyfr z 0 do 9999999, która reprezentuje sekundy ułamkowe. W informatica ułamkowe sekundy są obcinane, gdy n jest mniejsze niż 3.
Długość postaci Minimum 19 pozycji (yyyy-MM-dd HH:mm:ss) do 27 maksymalnych (yyyy-MM-dd HH:mm:ss.0000000)
Precyzja, skala Od 0 do 7 cyfr z dokładnością 100 nanosekund (100 ns). Domyślna precyzja to 7 cyfr.

W usłudze Microsoft Fabric Data Warehouse ta precyzja może być liczbą całkowitą z zakresu od 0 do 6, bez wartości domyślnej. Precyzja musi być określona w usłudze Microsoft Fabric Data Warehouse.
Rozmiar magazynu 1 6 bajtów dla precyzji mniejszej niż 3.
7 bajtów dla precyzji 3 lub 4.

Cała inna precyzja wymaga 8 bajtów. 2
Accuracy 100 nanosekund
Wartość domyślna 1900-01-01 00:00:00
Calendar Gregorian
Precyzja ułamkowa zdefiniowana przez użytkownika Yes
Rozpoznawanie i zachowywanie przesunięcia strefy czasowej No
Uwzględnianie światła dziennego No

1 Podane wartości są przeznaczone dla nieskompresowanego magazynu wierszy. Użycie kompresji danych lub magazynu kolumn może zmienić rozmiar magazynu dla każdej precyzji. Ponadto rozmiar magazynu na dysku i w pamięci może się różnić. Na przykład wartości datetime2 zawsze wymagają 8 bajtów w pamięci, gdy jest używany tryb wsadowy.

2 Gdy wartość datetime2 jest rzutowany na wartość varbinary , dodatkowy bajt jest dodawany do wartości varbinary w celu przechowywania dokładności.

Aby uzyskać metadane typu danych, zobacz sys.systypes lub TYPEPROPERTY. Precyzja i skala to zmienna dla niektórych typów danych daty i godziny. Aby uzyskać precyzję i skalę dla kolumny, zobacz COLUMNPROPERTY, COL_LENGTH lub sys.columns.

Obsługiwane formaty literałów ciągu dla daty/godziny2

W poniższych tabelach wymieniono obsługiwane formaty literałów ciągu ISO 8601 i ODBC dla daty/godziny2. Aby uzyskać informacje o formatach alfabetycznych, liczbowych, niesepatycznych i godzinowych dla części daty i godziny daty/godziny 2, zobacz data i godzina.

ISO 8601 Descriptions
yyyy-MM-ddTHH:mm:ss[.nnnnnnn] Ten format nie ma wpływu na SET LANGUAGE ustawienia regionalne i SET DATEFORMAT sesji. Dwukropki T(:) i kropka (.) są uwzględniane w literału ciągu, na przykład 2024-05-02T19:58:47.1234567.
ODBC Description
{ ts 'yyyy-MM-dd HH:mm:ss[.nnnnnnn]' } Specyficzne dla interfejsu API ODBC:

Liczba cyfr z prawej strony punktu dziesiętnego, który reprezentuje sekundy ułamkowe, można określić z zakresu od 0 do 7 (100 nanosekund).

Zgodność ze standardami ANSI i ISO 8601

Zgodność usług ANSI i ISO 8601 daty i godziny ma zastosowanie do daty/godziny2.

Zgodność z poprzednimi wersjami dla klientów na poziomie starszym

Niektórzy klienci na poziomie podrzędnym nie obsługują typów danych data, data, data/godzina2 i data/godzina/godzina.. W poniższej tabeli przedstawiono mapowanie typów między wystąpieniem najwyższego poziomu programu SQL Server a klientami na poziomie podrzędnym.

Typ danych programu SQL Server Domyślny format literału ciągu przekazywany do klienta na poziomie podrzędnym OdBC na poziomie dół OLEDB na poziomie dół JDBC na poziomie w dół Program SQLCLIENT na poziomie podrzędnym
time HH:mm:ss[.nnnnnnn] SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Ciąg lub ciąg sqstring
date yyyy-MM-dd SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Ciąg lub ciąg sqstring
datetime2 rrrr-MM-dd HH:mm:ss[.nnnnnnnnn] SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Ciąg lub ciąg sqstring
datetimeoffset rrrr-MM-dd HH:mm:ss[.nnnnnnnnn] [+|-]hh:mm SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Ciąg lub ciąg sqstring

Konwertowanie danych daty i godziny

Podczas konwertowania na typy danych daty i godziny aparat bazy danych odrzuca wszystkie wartości, których nie może rozpoznać jako daty lub godziny. Aby uzyskać informacje o korzystaniu z funkcji CAST i CONVERT z danymi daty i godziny, zobacz CAST and CONVERT

Konwertowanie innych typów dat i godzin na typ danych datetime2

W tej sekcji opisano, co się dzieje, gdy inne typy danych daty i godziny są konwertowane na typ danych datetime2 .

Gdy konwersja pochodzi z daty , jest kopiowany rok, miesiąc i dzień. Składnik czasu jest ustawiony na 00:00:00.0000000. Poniższy kod przedstawia wyniki konwertowania wartości date na wartość datetime2.

DECLARE @date AS DATE = '12-21-16';

DECLARE @datetime2 AS DATETIME2 = @date;

SELECT @datetime2 AS '@datetime2',
       @date AS '@date';

Oto zestaw wyników.

@datetime2                  @date
--------------------------- ----------
2016-12-21 00:00:00.0000000 2016-12-21

Gdy konwersja pochodzi z godziny (n), składnik godziny jest kopiowany, a składnik daty jest ustawiony na 1900-01-01wartość . Poniższy przykład przedstawia wyniki konwertowania wartości time(7) na wartość datetime2 .

DECLARE @time AS TIME (7) = '12:10:16.1234567';

DECLARE @datetime2 AS DATETIME2 = @time;

SELECT @datetime2 AS '@datetime2',
       @time AS '@time';

Oto zestaw wyników.

@datetime2                  @time
--------------------------- ----------------
1900-01-01 12:10:16.1234567 12:10:16.1234567

Gdy konwersja pochodzi z smalldatetime, godziny i minuty są kopiowane. Sekundy i sekundy ułamkowe są ustawione na 0. Poniższy kod przedstawia wyniki konwertowania wartości smalldatetime na wartość datetime2.

DECLARE @smalldatetime AS SMALLDATETIME = '12-01-16 12:32';

DECLARE @datetime2 AS DATETIME2 = @smalldatetime;

SELECT @datetime2 AS '@datetime2',
       @smalldatetime AS '@smalldatetime';

Oto zestaw wyników.

@datetime2                  @smalldatetime
--------------------------- -----------------------
2016-12-01 12:32:00.0000000 2016-12-01 12:32:00

Gdy konwersja pochodzi z elementu datetimeoffset(n), składniki daty i godziny są kopiowane. Strefa czasowa jest obcięta. W poniższym przykładzie przedstawiono wyniki konwertowania wartości datetimeoffset(7) na wartość datetime2.

DECLARE @datetimeoffset AS DATETIMEOFFSET (7) = '2016-10-23 12:45:37.1234567 +10:0';

DECLARE @datetime2 AS DATETIME2 = @datetimeoffset;

SELECT @datetime2 AS '@datetime2',
       @datetimeoffset AS '@datetimeoffset';

Oto zestaw wyników.

@datetime2                  @datetimeoffset
--------------------------- ----------------------------------
2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00

Gdy konwersja pochodzi z daty/godziny, data i godzina są kopiowane. Precyzja ułamkowa jest rozszerzana na 7 cyfr. W poniższym przykładzie przedstawiono wyniki konwertowania wartości datetime na wartość datetime2.

DECLARE @datetime AS DATETIME = '2016-10-23 12:45:37.333';

DECLARE @datetime2 AS DATETIME2 = @datetime;

SELECT @datetime2 AS '@datetime2',
       @datetime AS '@datetime';

Oto zestaw wyników.

@datetime2                  @datetime
----------------------- ---------------------------
2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333

Jawne rzutowanie do daty/godziny2 podczas korzystania z daty/godziny

W obszarze Poziom zgodności bazy danych 130 i nowszych niejawne konwersje z typów danych datetimedo datetime2 pokazują lepszą dokładność, uwzględniając ułamkowe milisekundy, co powoduje różne przekonwertowane wartości, jak pokazano w poprzednim przykładzie. Użyj jawnego rzutowania do typu danych datetime2 za każdym razem, gdy istnieje scenariusz porównania mieszanego między typami danych datetime i datetime2 . Aby uzyskać więcej informacji, zobacz ulepszenia programu SQL Server i usługi Azure SQL Database w zakresie obsługi niektórych typów danych i nietypowych operacji.

Konwertowanie literałów ciągu na wartość datetime2

Konwersje z literałów ciągów do typów daty i godziny są dozwolone, jeśli wszystkie części ciągów są w prawidłowych formatach. W przeciwnym razie zostanie zgłoszony błąd środowiska uruchomieniowego. Niejawne konwersje lub jawne konwersje, które nie określają stylu, od typów daty i godziny do literałów ciągu są w domyślnym formacie bieżącej sesji. W poniższej tabeli przedstawiono reguły konwertowania literału ciągu na typ danych datetime2 .

Literał ciągu wejściowego datetime2(n)
ODBC DATE Literały ciągu ODBC są mapowane na typ danych typu data/godzina . Każda operacja przypisania z ODBC DATETIME literałów do typów datetime2 powoduje niejawną konwersję między datą/godziną a tym typem zdefiniowanym przez reguły konwersji.
ODBC TIME Zobacz poprzednią ODBC DATE regułę.
ODBC DATETIME Zobacz poprzednią ODBC DATE regułę.
DATE tylko Część jest domyślnie ustawiona TIME na 00:00:00.
TIME tylko Część jest domyślnie ustawiona DATE na 1900-01-01.
TIMEZONE tylko Podano wartości domyślne.
DATE + TIME Błahy.
DATE + TIMEZONE Niedozwolone.
TIME + TIMEZONE Część domyślna DATE to 1900-1-1. TIMEZONE dane wejściowe są ignorowane.
DATE + TIME + TIMEZONE Używany jest lokalny DATETIME .

Examples

Poniższy przykład porównuje wyniki rzutowania ciągu do każdej daty i godziny typu danych.

SELECT CAST ('2007-05-08 12:35:29. 1234567 +12:15' AS TIME (7)) AS 'time',
       CAST ('2007-05-08 12:35:29. 1234567 +12:15' AS DATE) AS 'date',
       CAST ('2007-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
       CAST ('2007-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
       CAST ('2007-05-08 12:35:29. 1234567 +12:15' AS DATETIME2 (7)) AS 'datetime2',
       CAST ('2007-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET (7)) AS 'datetimeoffset';

Oto zestaw wyników.

Typ danych Output
time 12:35:29.1234567
date 2007-05-08
smalldatetime 2007-05-08 12:35:00
datetime 2007-05-08 12:35:29.123
datetime2 2007-05-08 12:35:29.1234567
datetimeoffset 2007-05-08 12:35:29.1234567 +12:15