Sdílet prostřednictvím


datetime2 (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Definuje datum, které je v kombinaci s časem dne založeném na 24hodinovém formátu. datetime2 lze považovat za rozšíření existujícího typu datetime , který má větší rozsah kalendářních dat, větší výchozí desetinnou přesnost a volitelnou přesnost určenou uživatelem.

Popis datetime2

Property Value
Syntax datetime2 [ (přesnost desetinné sekundy) ]
Usage DECLARE @MyDatetime2 datetime2(7);
CREATE TABLE Table1 (Column1 datetime2(7));
Výchozí formát řetězcového literálu

(používá se pro klienta nižší úrovně)
yyyy-MM-dd HH:mm:ss[.nnnnnnn]

Další informace naleznete v části Zpětná kompatibilita pro klienty nižší úrovně dále v tomto článku.
Rozsah kalendářních dat 0001-01-01 prostřednictvím 9999-12-31

1. ledna 1 až 31. prosince 9999 CE
Časový rozsah 00:00:00 prostřednictvím 23:59:59.9999999
Rozsah posunu časového pásma None
Rozsahy prvků yyyy je čtyřciferné číslo v rozsahu od 0001 roku 9999, který představuje rok.

MM je dvouciferné číslo v rozsahu od 01 do 12, který představuje měsíc v zadaném roce.

dd je dvouciferné číslo v závislosti 01 na 31 měsíci, které představuje den zadaného měsíce.

HH je dvouciferné číslo v rozsahu od 00 do 23, který představuje hodinu.

mm je dvouciferné číslo v rozsahu od 00 do 59, který představuje minutu.

ss je dvouciferné číslo v rozsahu od 00 do 59, který představuje sekundu.

n* je číslice od do sedmimístného čísla 09999999, které představuje desetinné sekundy. V Informatica jsou desetinné sekundy zkráceny, pokud n je menší než 3.
Délka postavy 19 pozic minimálně (yyyy-MM-dd HH:mm:ss) až 27 maximum (yyyy-MM-dd HH:mm:ss.0000000)
Přesnost, měřítko 0 až 7 číslic s přesností 100 nanosekund (100 ns). Výchozí přesnost je 7 číslic.

V Microsoft Fabric Data Warehouse může být tato přesnost celé číslo od 0 do 6 bez výchozího nastavení. Přesnost musí být zadána v datovém skladu Microsoft Fabric.
Velikost úložiště 1 6 bajtů pro přesnost menší než 3.
7 bajtů pro přesnost 3 nebo 4.

Všechny ostatní přesnosti vyžadují 8 bajtů. 2
Accuracy 100 nanosekund
Výchozí hodnota 1900-01-01 00:00:00
Calendar Gregorian
Přesnost desetinné sekundy definované uživatelem Yes
Informace o posunu časových pásem a zachování No
Informace o letním letním času No

1 Zadané hodnoty jsou pro nekomprimované úložiště řádků. Použití komprese dat nebo columnstore může změnit velikost úložiště pro každou přesnost. Velikost úložiště na disku a v paměti se navíc může lišit. Například hodnoty datetime2 vždy vyžadují 8 bajtů v paměti při použití dávkového režimu.

2 Když je hodnota datetime2 přetypována na varbinární hodnotu, přidá se k hodnotě varbinary extra bajt k uložení přesnosti.

Metadata datového typu naleznete v části sys.systypes nebo TYPEPROPERTY. Přesnost a měřítko jsou proměnné pro některé datové typy data a času. Pokud chcete získat přesnost a měřítko sloupce, přečtěte si téma COLUMNPROPERTY, COL_LENGTH nebo sys.columns.

Podporované formáty řetězcového literálu pro datetime2

Následující tabulky uvádějí podporované formáty literálů ISO 8601 a ODBC pro datum a čas2. Informace o abecedním, číselném, nepopsaného formátu a formátu času pro části data a času data a času 2 najdete v tématu datum a čas.

ISO 8601 Descriptions
yyyy-MM-ddTHH:mm:ss[.nnnnnnn] Tento formát není ovlivněn SET LANGUAGE nastavením národního prostředí a SET DATEFORMAT relace. , Tdvojtečky (:) a tečka (.) jsou zahrnuty do řetězcového literálu, například 2024-05-02T19:58:47.1234567.
rozhraní ODBC Description
{ ts 'yyyy-MM-dd HH:mm:ss[.nnnnnnn]' } Specifické pro rozhraní ODBC API:

Počet číslic napravo od desetinné čárky, která představuje desetinnou čárku, lze zadat od 0 do 7 (100 nanosekund).

DODRŽOVÁNÍ PŘEDPISŮ ANSI a ISO 8601

Dodržování předpisů ANSI a ISO 8601 pro datum a čas platí pro datetime2.

Zpětná kompatibilita pro klienty nižší úrovně

Někteří klienti nižší úrovně nepodporují datové typy time, date, datetime2 a datetimeoffset. Následující tabulka ukazuje mapování typů mezi instancí SQL Serveru na vyšší úrovni a klienty nižší úrovně.

Datový typ SQL Serveru Výchozí formát literálu řetězce předaný klientovi nižší úrovně Rozhraní ODBC nižší úrovně OLEDB nižší úrovně JDBC nižší úrovně SQLCLIENT nižší úrovně
time HH:mm:ss[.nnnnnnn] SQL_WVARCHAR nebo SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Řetězec nebo SqString
date yyyy-MM-dd SQL_WVARCHAR nebo SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Řetězec nebo SqString
datetime2 yyyy-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHAR nebo SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Řetězec nebo SqString
datetimeoffset yyyy-MM-dd HH:mm:ss[.nnnnnnnn] [+|-]hh:mm SQL_WVARCHAR nebo SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String Řetězec nebo SqString

Převod dat data a času

Při převodu na datové typy data a času databázový stroj odmítne všechny hodnoty, které nedokáže rozpoznat jako kalendářní data nebo časy. Informace o použití funkcí CAST a CONVERT s daty data a času naleznete v tématu CAST a CONVERT

Převod jiných typů data a času na datový typ datetime2

Tato část popisuje, co se stane, když se jiné datové typy data a času převedou na datový typ datetime2 .

Při převodu z datase zkopíruje rok, měsíc a den. Časová komponenta je nastavena na 00:00:00.0000000. Následující kód ukazuje výsledky převodu hodnoty date na hodnotu datetime2.

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

DECLARE @datetime2 AS DATETIME2 = @date;

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

Tady je soubor výsledků.

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

Při převodu z času(n) se zkopíruje časová komponenta a komponenta data je nastavena na 1900-01-01hodnotu . Následující příklad ukazuje výsledky převodu hodnoty time(7) na hodnotu datetime2 .

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

DECLARE @datetime2 AS DATETIME2 = @time;

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

Tady je soubor výsledků.

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

Pokud je převod z smalldatetime, hodiny a minuty se zkopírují. Sekundy a zlomkové sekundy jsou nastaveny na 0. Následující kód ukazuje výsledky převodu hodnoty smalldatetime na hodnotu datetime2.

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

DECLARE @datetime2 AS DATETIME2 = @smalldatetime;

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

Tady je soubor výsledků.

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

Při převodu z datetimeoffset(n) se zkopírují komponenty data a času. Časové pásmo je zkráceno. Následující příklad ukazuje výsledky převodu datetimeoffset(7) hodnoty na datetime2 hodnotu.

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';

Tady je soubor výsledků.

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

Při převodu z data a času se datum a čas zkopírují. Desetinná přesnost je rozšířena na 7 číslic. Následující příklad ukazuje výsledky převodu datetime hodnoty na datetime2 hodnotu.

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

DECLARE @datetime2 AS DATETIME2 = @datetime;

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

Tady je soubor výsledků.

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

Explicitní přetypování na datetime2 při použití datetime

V rámci úrovně kompatibility databáze 130 a vyšší se implicitní převody datových typů datetime na datetime2 zobrazují vyšší přesnost díky tomu, že se započítávání desetinných milisekund, což vede k různým převedeným hodnotám, jak je vidět v předchozím příkladu. Explicitní přetypování na datový typ datetime2 použijte vždy, když existuje smíšený scénář porovnání mezi datovými typy datetime a datetime2 . Další informace najdete v tématu Vylepšení SQL Serveru a Azure SQL Database při zpracování některých datových typů a neobvyklých operací.

Převod řetězcových literálů na datetime2

Převody z řetězcových literálů na typy data a času jsou povoleny, pokud jsou všechny části řetězců v platných formátech. V opačném případě se vyvolá chyba modulu runtime. Implicitní převody nebo explicitní převody, které nezadávají styl, od typů data a času po řetězcové literály jsou ve výchozím formátu aktuální relace. Následující tabulka uvádí pravidla pro převod řetězcového literálu na datový typ datetime2 .

Literál vstupního řetězce datetime2(n)
ODBC DATE Řetězcové literály ODBC se mapují na datový typ datetime . Jakákoli operace přiřazení z ODBC DATETIME literálů do typů datetime2 způsobí implicitní převod mezi datetime a tímto typem definovaným pravidly převodu.
ODBC TIME Viz předchozí ODBC DATE pravidlo.
ODBC DATETIME Viz předchozí ODBC DATE pravidlo.
DATE pouze Výchozí hodnota TIME části 00:00:00je .
TIME pouze Výchozí hodnota DATE části 1900-01-01je .
TIMEZONE pouze Zadají se výchozí hodnoty.
DATE + TIME Triviální.
DATE + TIMEZONE Nepovoleno.
TIME + TIMEZONE Výchozí hodnota DATE části je 1900-1-1. TIMEZONE vstup je ignorován.
DATE + TIME + TIMEZONE Použije se místní DATETIME .

Examples

Následující příklad porovnává výsledky přetypování řetězce k jednotlivým kalendářním a času datového typu.

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';

Tady je soubor výsledků.

Datový typ 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