Sdílet prostřednictvím


datetime (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPlatform Platform System (PDW)databáze SQL v Microsoft Fabric

Definuje datum v kombinaci s časem dne se zlomkovými sekundami založenými na 24hodinovém formátu.

Nepoužívejte datetime pro novou práci. Místo toho použijte čas, datum, datetime2a datové typy datetimeoffset. Tyto typy odpovídají standardu SQL a jsou přenosnější. časové, datetime2 a datetimeoffset větší přesnost sekund. datetimeoffset poskytuje podporu časového pásma pro globálně nasazené aplikace.

Popis

Vlastnost Hodnota
syntaxe DATETIME
využití DECLARE @MyDatetime DATETIME;
CREATE TABLE Table1 (Column1 DATETIME);
výchozí formáty řetězcového literálu (používané pro klienta nižší úrovně) Nejde použít
rozsahu dat 1753-01-01 (1. ledna 1753) až 9999-12-31 (31. prosince 9999)
časový rozsah 00:00:00 až 23:59:59.997
rozsah posunu časového pásma Žádný
rozsahy elementů yyyy jsou čtyři číslice od 1753 do 9999, které představují rok.

MM jsou dvě číslice v rozsahu od 01 po 12, které představují měsíc v zadaném roce.

dd jsou dvě číslice, od 01 do 31 v závislosti na měsíci, který představuje den zadaného měsíce.

HH jsou dvě číslice, od 00 po 23, které představují hodinu.

mm jsou dvě číslice, od 00 po 59, které představují minutu.

ss jsou dvě číslice v rozsahu od 00 po 59, které představují sekundu.

n* je nula až tři číslice v rozsahu od 0 po 999, které představují desetinné sekundy.
délka znaku Maximálně 19 pozic až 23
velikost úložiště 8 bajtů
přesnost Zaokrouhleno na přírůstky .000, .003nebo .007 sekund
Výchozí hodnota 1900-01-01 00:00:00
kalendář Gregoriánský (zahrnuje celý rozsah let)
přesnost desetinné sekundy definované uživatelem Ne
posun časového pásma s vědomím a zachováním Ne
s podporou letního času Ne

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

Následující tabulky uvádějí podporované formáty řetězcového literálu pro datetime. Kromě rozhraní ODBC jsou řetězcové literály datetime v jednoduchých uvozovkách ('), například 'string_literaL'. Pokud prostředí není us_english, řetězcové literály by měly být ve formátu Unicode N'string_literaL'.

Číselný formát

Data kalendářních dat můžete zadat pomocí zadaného číselného měsíce. Například 5/20/97 představuje dvacátý den května 1997. Při použití číselného formátu data zadejte měsíc, den a rok v řetězci, který jako oddělovače používá lomítko (/), spojovníky (-) nebo tečky (.). Tento řetězec musí být zobrazen v následujícím formátu:

<number separator number separator number [time] [time]>

Pokud je jazyk nastavený na us_english, výchozí pořadí data je mdy (měsíc, den, rok). Pořadí dat můžete změnit pomocí příkazu SET DATEFORMAT.

Nastavení pro SET DATEFORMAT určuje způsob interpretace hodnot kalendářních dat. Pokud pořadí neodpovídá nastavení, hodnoty se neinterpretují jako kalendářní data. Data mimo pořadí můžou být nesprávně interpretována jako mimo rozsah nebo s nesprávnými hodnotami. Například 12/10/08 lze interpretovat jako jedno ze šesti kalendářních dat v závislosti na nastavení DATEFORMAT. Čtyřdílný rok se interpretuje jako rok.

Formát data Objednávka
[0]4/15/[19]96 mdy
[0]4-15-[19]96 mdy
[0]4.15.[19]96 mdy
[0]4/[19]96/15 myd
15/[0]4/[19]96 dmy
15/[19]96/[0]4 dym
[19]96/15/[0]4 ydm
[19]96/[0]4/15 ymd
Formát času
14:30
14:30[:20:997]
14:30[:20.9]
4am
4 PM

Abecední formát

Data kalendářních dat můžete zadat s měsícem zadaným jako úplný název měsíce. Například Aprilnebo zkratka měsíce Apr, specifikovaná v aktuálním jazyce. Čárky jsou volitelné a velká písmena se ignorují.

Tady je několik pokynů pro použití abecedního formátu kalendářních dat:

  • Data data data a času uzavřete do jednoduchých uvozovek ('). Pro jiné jazyky než angličtinu použijte N''.

  • Znaky uzavřené v hranatých závorkách jsou volitelné.

  • Pokud zadáte pouze poslední dvě číslice v roce, hodnoty menší než poslední dvě číslice hodnoty dvoumístný rok odříznutí konfigurace jsou ve stejném století jako rok odříznutí. Hodnoty větší než nebo rovny hodnotě této možnosti jsou ve století, které přichází před odříznutý rok. Pokud je například dvouciferný rok2050 (výchozí), 25 se interpretuje jako 2025 a 50 se interpretuje jako 1950. Abyste se vyhnuli nejednoznačnosti, použijte čtyři číslice let.

  • Pokud den chybí, zobrazí se první den v měsíci.

  • Nastavení relace SET DATEFORMAT se nepoužije, když zadáte měsíc v abecedním formátu.

Abecední
Apr[il] [15][,] 1996
Apr[il] 15[,] [19]96
Apr[il] 1996 [15]
[15] Apr[il][,] 1996
15 Apr[il][,][19]96
15 [19]96 apr[il]
[15] 1996 apr[il]
1996 APR[IL] [15]
1996 [15] APR[IL]

Formát ISO 8601

Chcete-li použít formát ISO 8601, je nutné zadat každý prvek ve formátu, včetně T, dvojtečky (:) a tečky (.), které jsou zobrazeny ve formátu.

Hranaté závorky označují, že zlomek druhé komponenty je nepovinný. Časová komponenta je určena ve formátu 24 hodin. T označuje začátek časové části hodnoty datetime.

Výhodou použití formátu ISO 8601 je, že se jedná o mezinárodní normu s jednoznačnou specifikací. Tento formát také není ovlivněn nastavením SET DATEFORMAT nebo SET LANGUAGE.

Příklady:

  • 2004-05-23T14:25:10
  • 2004-05-23T14:25:10.487
ISO 8601
yyyy-MM-ddTHH:mm:ss[.mmm]
yyyyMMdd[ HH:mm:ss[.mmm]]

Neformátovaný formát

Tento formát je podobný formátu ISO 8601, s výjimkou toho, že neobsahuje žádné oddělovače kalendářních dat.

Neoddělené
yyyyMMdd HH:mm:ss[.mmm]

Formát ODBC

Rozhraní ODBC API definuje řídicí sekvence, které představují hodnoty data a času, které rozhraní ODBC volá data časového razítka. Tento formát časového razítka ODBC je podporován také definicí jazyka OLE DB (DBGUID-SQL) podporovaným poskytovatelem Microsoft OLE DB pro SQL Server. Aplikace, které používají rozhraní API založené na ADO, OLE DB a ODBC, můžou k reprezentaci kalendářních dat a časů použít tento formát časového razítka ODBC.

Řídicí sekvence časového razítka ODBC mají formát: { <literal_type> '<constant_value>' }:

  • <literal_type> určuje typ řídicí sekvence. Časová razítka mají tři specifikátory <literal_type>:

    • d = pouze datum
    • t = pouze čas
    • ts = časové razítko (čas + datum)
  • <constant_value> je hodnota řídicí sekvence. <constant_value> musí pro každou <literal_type>dodržovat tyto formáty:

    • d: yyyy-MM-dd
    • t: hh:mm:ss[.fff]
    • ts: yyyy-MM-dd HH:mm:ss[.fff]
ODBC
{ ts '1998-05-02 01:23:56.123' }
{ d '1990-10-02' }
{ t '13:33:41' }

Zaokrouhlování přesnosti desetinné sekundy data a času

hodnoty data a času se zaokrouhlují na přírůstky .000, .003nebo .007 sekund, jak je znázorněno v následujícím příkladu.

SELECT '01/01/2024 23:59:59.999' AS [User-specified value],
    CAST('01/01/2024 23:59:59.999' AS DATETIME) AS [System stored value]
UNION SELECT '01/01/2024 23:59:59.998', CAST('01/01/2024 23:59:59.998' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.997', CAST('01/01/2024 23:59:59.997' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.996', CAST('01/01/2024 23:59:59.996' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.995', CAST('01/01/2024 23:59:59.995' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.994', CAST('01/01/2024 23:59:59.994' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.993', CAST('01/01/2024 23:59:59.993' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.992', CAST('01/01/2024 23:59:59.992' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.991', CAST('01/01/2024 23:59:59.991' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.990', CAST('01/01/2024 23:59:59.990' AS DATETIME);

Tady je sada výsledků.

Uživatelem zadaná hodnota Systémová uložená hodnota
01/01/2024 23:59:59.999 2024-01-02 00:00:00.000
01/01/2024 23:59:59.998
01/01/2024 23:59:59.997
01/01/2024 23:59:59.996
01/01/2024 23:59:59.995
2024-01-01 23:59:59.997
01/01/2024 23:59:59.994
01/01/2024 23:59:59.993
01/01/2024 23:59:59.992
2024-01-01 23:59:59.993
01/01/2024 23:59:59.991
01/01/2024 23:59:59.990
2024-01-01 23:59:59.990

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

data a času není kompatibilní se standardem ANSI ani ISO 8601.

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 datetime

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

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

DECLARE @date DATE = '12-21-16';
DECLARE @datetime DATETIME = @date;

SELECT @datetime AS '@datetime', @date AS '@date';

Tady je sada výsledků.

@datetime                @date
------------------------ -----------
2016-12-21 00:00:00.000  2016-12-21

Předchozí příklad používá konkrétní formát data (MM-DD-YY).

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

Příklad byste měli aktualizovat tak, aby odpovídal formátu vaší oblasti.

Můžete také dokončit příklad s formátem data kompatibilním se standardem ISO 8601 (yyyy-MM-dd). Například:

DECLARE @date DATE = '2016-12-21';
DECLARE @datetime DATETIME = @date;

SELECT @datetime AS '@datetime', @date AS '@date';

Při převodu z času(n), komponenta času je zkopírována a komponenta data je nastavena na 1900-01-01. Pokud je desetinná přesnost času(n) hodnota větší než tři číslice, je hodnota zkrácena tak, aby odpovídala. Následující příklad ukazuje výsledky převodu TIME(4) hodnoty na DATETIME hodnotu.

DECLARE @time TIME(4) = '12:10:05.1237';
DECLARE @datetime DATETIME = @time;

SELECT @datetime AS '@datetime', @time AS '@time';

Tady je sada výsledků.

@datetime                @time
------------------------ --------------
1900-01-01 12:10:05.123  12:10:05.1237

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 DATETIME.

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

SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';

Tady je sada výsledků.

@datetime                @smalldatetime
------------------------ --------------------
2016-12-01 12:32:00.000  2016-12-01 12:32:00

Při převodu z datetimeoffset(n), zkopírují se komponenty data a času. Časové pásmo je zkráceno. Pokud je desetinná přesnost datetimeoffset(n) hodnota větší než tři číslice, je hodnota zkrácena. Následující příklad ukazuje výsledky převodu DATETIMEOFFSET(4) hodnoty na DATETIME hodnotu.

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1968-10-23 12:45:37.1234 +10:0';
DECLARE @datetime DATETIME = @datetimeoffset;

SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';

Tady je sada výsledků.

@datetime                @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237 +10:0

Při převodu z datetime2(n), datum a čas se zkopírují. Pokud je desetinná přesnost datetime2(n) hodnota větší než tři číslice, je hodnota zkrácena. Následující příklad ukazuje výsledky převodu DATETIME2(4) hodnoty na DATETIME hodnotu.

DECLARE @datetime2 DATETIME2(4) = '1968-10-23 12:45:37.1237';
DECLARE @datetime DATETIME = @datetime2;

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

Tady je sada výsledků.

@datetime                @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237

Příklady

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('2024-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
    CAST('2024-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
    CAST('2024-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset';

Tady je sada výsledků.

Datový typ Výstup
time 12:35:29.1234567
date 2024-05-08
smalldatetime 2024-05-08 12:35:00
datetime 2024-05-08 12:35:29.123
datetime2 2024-05-08 12:35:29.1234567
datetimeoffset 2024-05-08 12:35:29.1234567 +12:15
  • CAST a CONVERT (Transact-SQL)