datetime (Transact-SQL)
Dotyczy:sql Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics 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ć
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 , .003 lub .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 April
lub 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żyjN''
.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
, .003
lub .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 |