Udostępnij za pośrednictwem


datetime (Transact-SQL)

Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Database w usłudze Microsoft Fabric

Definiuje datę, która jest połączona z godziną dnia z ułamkami sekund, która jest oparta na zegarze 24-godzinnym.

Unikaj używania data/godzina dla nowej pracy. Zamiast tego należy użyćgodziny , daty, daty/godziny2i typów danych datetimeoffset. Te typy są zgodne ze standardem SQL i są bardziej przenośne. godziny datetime2 i datetimeoffset zapewniają większą precyzję sekund. datetimeoffset zapewnia obsługę stref czasowych dla aplikacji wdrożonych globalnie.

Opis

Własność Wartość
składni DATETIME
użycie DECLARE @MyDatetime DATETIME;
CREATE TABLE Table1 (Column1 DATETIME);
domyślne formaty literału ciągu (używane dla klienta na poziomie down-level) Nie dotyczy
zakres dat 1753-01-01 (1 stycznia, 1753) do 9999-12-31 (31 grudnia 9999)
zakres czasu od 00:00:00 do 23:59:59.997
zakres przesunięcia strefy czasowej Żaden
zakresy elementów yyyy to cztery cyfry z 1753 do 9999 reprezentujące rok.

MM to dwie cyfry, od 01 do 12, które reprezentują miesiąc w określonym roku.

dd to dwie cyfry, począwszy od 01 do 31 w zależności od miesiąca, który reprezentuje dzień określonego miesiąca.

HH to dwie cyfry, od 00 do 23, które reprezentują godzinę.

mm to dwie cyfry, od 00 do 59, które reprezentują minutę.

ss to dwie cyfry, od 00 do 59, które reprezentują drugą.

n* wynosi od zera do trzech cyfr, od 0 do 999, które reprezentują ułamkowe sekundy.
długość znaku Maksymalnie 19 pozycji do 23
Rozmiar magazynu 8 bajtów
dokładności Zaokrąglone do przyrostów .000, .003lub .007 sekund
wartość domyślna 1900-01-01 00:00:00
kalendarz Gregoriański (łącznie z pełnym zakresem lat)
zdefiniowana przez użytkownika precyzja ułamkowa sekundy Nie
Rozpoznawanie i zachowywanie strefy czasowej Nie
z zapisywaniem światła dziennego Nie

Obsługiwane formaty literału ciągu dla daty/godziny

W poniższych tabelach wymieniono obsługiwane formaty literału ciągu dla data/godzina. Z wyjątkiem odBC literały ciągu daty/godziny są w pojedynczych cudzysłowach ('), na przykład 'string_literaL'. Jeśli środowisko nie jest us_english, literały ciągu powinny mieć format Unicode N'string_literaL'.

Format liczbowy

Możesz określić dane daty z określonym miesiącem liczbowym. Na przykład 5/20/97 reprezentuje dwudziesty dzień maja 1997 r. Jeśli używasz formatu daty liczbowej, określ miesiąc, dzień i rok w ciągu, który używa ukośników (/), łączników (-) lub okresów (.) jako separatorów. Ten ciąg musi zostać wyświetlony w następującym formularzu:

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

Gdy język jest ustawiony na us_english, domyślna kolejność daty to mdy (miesiąc, dzień, rok). Kolejność dat można zmienić przy użyciu instrukcji SET DATEFORMAT.

Ustawienie dla SET DATEFORMAT określa sposób interpretowania wartości daty. Jeśli kolejność nie jest zgodna z ustawieniem, wartości nie są interpretowane jako daty. Daty poza kolejnością mogą być błędnie interpretowane jako poza zakresem lub z nieprawidłowymi wartościami. Na przykład 12/10/08 można interpretować jako jedną z sześciu dat, w zależności od ustawienia DATEFORMAT. Czteroczęściowy rok jest interpretowany jako rok.

Format daty Porządek
[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
Format godziny
14:30
14:30[:20:997]
14:30[:20.9]
4am
4 PM

Format alfabetyczny

Możesz określić dane daty z miesiącem określonym jako pełna nazwa miesiąca. Na przykład Aprillub skrót miesiąca Apr, określony w bieżącym języku. Przecinki są opcjonalne, a wielkie litery są ignorowane.

Poniżej przedstawiono kilka wskazówek dotyczących używania formatów dat alfabetycznych:

  • Ujmij dane daty i godziny w pojedynczych cudzysłowach ('). W przypadku języków innych niż angielski użyj N''.

  • Znaki ujęte w nawiasy są opcjonalne.

  • Jeśli określisz tylko dwie ostatnie cyfry roku, wartości mniejsze niż dwie ostatnie cyfry wartości dwa cyfry roku odcinania opcji konfiguracji są w tym samym wieku co rok odcinania. Wartości większe niż lub równe wartości tej opcji są w wieku, który następuje przed rokiem redukcji. Jeśli na przykład dwa cyfry jest (wartość domyślna), jest interpretowana jako , a jest interpretowana jako . Aby uniknąć niejednoznaczności, użyj czterech cyfr lat.

  • Jeśli brakuje dnia, pierwszy dzień miesiąca jest dostarczany.

  • Ustawienie sesji SET DATEFORMAT nie jest stosowane podczas określania miesiąca w postaci alfabetycznej.

Alfabetyczny
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]

Format ISO 8601

Aby użyć formatu ISO 8601, należy określić każdy element w formacie, w tym T, dwukropki (:) i kropkę (.), które są wyświetlane w formacie.

Nawiasy wskazują, że ułamek drugiego składnika jest opcjonalny. Składnik czasu jest określony w formacie 24-godzinnym. T wskazuje początek części godziny wartości data/godzina.

Zaletą korzystania z formatu ISO 8601 jest to, że jest to międzynarodowy standard ze jednoznaczną specyfikacją. Ponadto ten format nie ma wpływu na ustawienie SET DATEFORMAT ani SET LANGUAGE.

Przykłady:

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

Unseparated format (Nieseparated format)

Ten format jest podobny do formatu ISO 8601, z wyjątkiem tego, że nie zawiera separatorów dat.

Nierozdzielone
yyyyMMdd HH:mm:ss[.mmm]

Format ODBC

Interfejs API ODBC definiuje sekwencje ucieczki reprezentujące wartości daty i godziny, które odBC wywołuje dane sygnatury czasowej. Ten format znacznika czasu ODBC jest również obsługiwany przez definicję języka OLE DB (DBGUID-SQL) obsługiwaną przez dostawcę Microsoft OLE DB dla programu SQL Server. Aplikacje korzystające z interfejsów API opartych na protokole ADO, OLE DB i ODBC mogą używać tego formatu znacznika czasu ODBC do reprezentowania dat i godzin.

Sekwencje ucieczki znacznika czasu ODBC mają format: { <literal_type> '<constant_value>' }:

  • <literal_type> określa typ sekwencji ucieczki. Znaczniki czasu mają trzy specyfikatory <literal_type>:

    • d = tylko data
    • t = tylko czas
    • ts = znacznik czasu (godzina i data)
  • <constant_value> jest wartością sekwencji ucieczki. <constant_value> muszą być zgodne z tymi formatami dla każdego <literal_type>:

    • 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' }

Zaokrąglanie ułamkowej sekundy daty/godziny

wartości daty/godziny są zaokrąglane do przyrostów wartości .000, .003lub .007 sekund, jak pokazano w poniższym przykładzie.

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

Oto zestaw wyników.

Wartość określona przez użytkownika Wartość przechowywana przez system
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

Zgodność ze standardami ANSI i ISO 8601

data/godzina nie jest zgodna ze standardem ANSI ani iso 8601.

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 i CONVERT.

Konwertowanie innych typów danych daty i godziny na typ danych typu data/godzina

W tej sekcji opisano, co ma miejsce, gdy inne typy danych daty i godziny są konwertowane na typ danych data/godzina.

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

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

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

Oto zestaw wyników.

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

W poprzednim przykładzie użyto formatu daty specyficznego dla regionu (MM-DD-YY).

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

Należy zaktualizować przykład, aby był zgodny z formatem regionu.

Możesz również wypełnić przykład zgodnym formatem daty ISO 8601 (yyyy-MM-dd). Na przykład:

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

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

Gdy konwersja pochodzi z czasu (n), składnik godziny jest kopiowany, a składnik daty jest ustawiony na 1900-01-01. Gdy ułamkowa precyzja czasu (n) wartość jest większa niż trzy cyfry, wartość jest obcięta w celu dopasowania. W poniższym przykładzie przedstawiono wyniki konwertowania wartości TIME(4) na wartość DATETIME.

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

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

Oto zestaw wyników.

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

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

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

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

Oto zestaw wyników.

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

Gdy konwersja pochodzi z datetimeoffset(n), składniki daty i godziny są kopiowane. Strefa czasowa jest obcięta. Gdy ułamkowa precyzja datetimeoffset(n) wartość jest większa niż trzy cyfry, wartość jest obcięta. W poniższym przykładzie przedstawiono wyniki konwertowania wartości DATETIMEOFFSET(4) na wartość DATETIME.

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

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

Oto zestaw wyników.

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

Gdy konwersja pochodzi z datetime2(n), data i godzina są kopiowane. Gdy ułamkowa precyzja datetime2(n) wartość jest większa niż trzy cyfry, wartość jest obcięta. W poniższym przykładzie przedstawiono wyniki konwertowania wartości DATETIME2(4) na wartość DATETIME.

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

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

Oto zestaw wyników.

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

Przykłady

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

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

Oto zestaw wyników.

Typ danych Wyjście
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