Udostępnij za pomocą


Data (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ę w programie SQL Server. Typ danych daty został wprowadzony w programie SQL Server 2008 (10.0.x).

Opis daty

Property Value
Syntax DATE
Usage DECLARE @MyDate DATE

CREATE TABLE Table1 (Column1 DATE)
Domyślny format literału ciągu

(używane w przypadku klienta na poziomie podrzędnym)
yyyy-MM-dd

Aby uzyskać więcej informacji, zobacz sekcję Zgodność z poprzednimi wersjami dla klientów na poziomie starszym .
Range 0001-01-01przez (9999-12-31 przez 1582-10-159999-12-31 dla Informatica)

1 stycznia 1 CE (wspólna era) do 31 grudnia 9999 CE (15 października 1582 CE do 31 grudnia 9999 CE dla Informatica)
Zakresy pierwiastków yyyy to cztery cyfry z 0001 do 9999 reprezentujące rok. Informatica ogranicza yyyy zakres 1582 do 9999.

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

ddto dwie cyfry z do 01, w zależności od 31 miesiąca, który reprezentuje dzień określonego miesiąca.
Długość postaci 10 pozycji
Precyzja, skala 10, 0
Rozmiar magazynu 3 bajty, stałe
Struktura magazynu jedna liczba całkowita 3-bajtowa przechowuje datę
Accuracy Jeden dzień
Wartość domyślna 1900-01-01

Ta wartość jest używana dla dołączonej części daty dla niejawnej konwersji z godziny na datetime2 lub datetimeoffset.
Calendar Gregorian
Precyzja ułamkowa zdefiniowana przez użytkownika No
Rozpoznawanie i zachowywanie przesunięcia strefy czasowej No
Uwzględnianie światła dziennego No

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

Na poniższych listach przedstawiono prawidłowe formaty literału ciągu dla typu danych daty .

[m]m, ddi [yy]yy reprezentują miesiąc, dzień i rok w ciągu z ukośnikami (/), łącznikami () lub kropkami (-.) jako separatorami.

Obsługiwane są tylko cztery cyfry lub dwa cyfry lat. Używaj czterocyfrowych lat, jeśli jest to możliwe. Aby określić liczbę całkowitą z 0001 , 9999 która reprezentuje rok odcięcia do interpretowania dwóch cyfr lat jako cztery cyfry lat, użyj opcji konfiguracji serwera odcinania dwucyfrowego roku .

Dla informatica jest yyyy ograniczony do zakresu 1582 do 9999.

Dwucyfrowy rok, który jest mniejszy lub równy ostatnim dwóm cyfrom roku odcięcia, jest w tym samym stuleciu co rok odcięcia. Dwucyfrowy rok większy niż ostatnie dwie cyfry roku odcięcia jest w wieku, który następuje przed rokiem odcięcia. Jeśli na przykład dwucyfrowe odcięcie roku jest wartością domyślną 2049, dwucyfrowy rok 49 jest interpretowany jako 2049 i dwucyfrowy rok 50 jest interpretowany jako 1950.

Bieżące ustawienie języka określa domyślny format daty. Format daty można zmienić przy użyciu instrukcji SET LANGUAGE i SET DATEFORMAT .

Format ydm nie jest obsługiwany dla daty.

Formaty literałów ciągu dla roku miesięcznego

SET DATEFORMAT mdy;
  • [m]m/dd/[yy]yy
  • [m]m-dd-[yy]yy

Formaty literału ciągu dla dni miesiąca

SET DATEFORMAT myd;
  • [m]m/[yy]yy/dd
  • [m]m-[yy]yy-dd
  • [m]m.[yy]yy.dd

Formaty literałów ciągu dla dni-miesiąc-rok

SET DATEFORMAT dmy;
  • dd/[m]m/[yy]yy
  • dd-[m]m-[yy]yy
  • dd.[m]m.[yy]yy

Formaty literałów ciągu dla miesiąca dziennego

SET DATEFORMAT dym;
  • dd/[yy]yy/[m]m
  • dd-[yy]yy-[m]m
  • dd.[yy]yy.[m]m

Formaty literału ciągu dla dni miesiąca

SET DATEFORMAT ymd;
  • [yy]yy/[m]m/dd
  • [yy]yy-[m]m-dd
  • [yy]yy-[m]m-dd

Alfabetyczna lista formatów

  • [dd] mon[,] yyyy
  • dd mon[,][yy]yy
  • dd [yy]yy mon
  • [dd] yyyy mon
  • mon [dd][,] yyyy
  • mon dd[,] [yy]
  • mon yyyy [dd]
  • yyyy mon [dd]
  • yyyy [dd] mon

mon reprezentuje pełną nazwę miesiąca lub skrót miesiąca podany w bieżącym języku. Przecinki są opcjonalne, a wielkie litery są ignorowane.

Aby uniknąć niejednoznaczności, użyj czterech cyfr lat.

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

Lista formatów ISO 8601

  • yyyy-MM-dd
  • yyyyMMdd

Tak samo jak w przypadku standardu SQL. Ten format jest jedynym formatem zdefiniowanym jako międzynarodowy standard.

Nieseparowana lista formatów

  • [yy]yyMMdd
  • yyyy[MMdd]

Dane daty można określić z czterema, sześcioma lub ośmioma cyframi. Ciąg sześciocyfrowy lub ośmiocyfrowy jest zawsze interpretowany jako ymd. Miesiąc i dzień muszą być zawsze dwiema cyframi. Czterocyfrowy ciąg jest interpretowany jako rok.

Format daty ODBC

  • { d 'yyyy-MM-dd' }

Specyficzne dla interfejsu API ODBC.

Format daty XML W3C

  • yyyy-MM-ddTZD

Obsługiwane w przypadku użycia kodu XML/SOAP.

TZD jest projektantem strefy czasowej (Z lub +hh:mm-hh:mm):

  • hh:mm reprezentuje przesunięcie strefy czasowej. hh to dwie cyfry, od 0 do 14, które reprezentują liczbę godzin przesunięcia strefy czasowej.

  • mm to dwie cyfry z zakresu od 0 do 59, które reprezentują liczbę dodatkowych minut przesunięcia strefy czasowej.

  • + (plus) lub - (minus) jest obowiązkowym znakiem przesunięcia strefy czasowej. Ten znak wskazuje, że w celu uzyskania czasu lokalnego przesunięcie strefy czasowej jest dodawane lub odejmowane z godziny uniwersalnej koordynowanej (UTC). Prawidłowy zakres przesunięcia strefy czasowej wynosi od -14:00 do +14:00.

Zgodność ze standardami ANSI i ISO 8601

data jest zgodna ze standardową definicją ANSI SQL dla kalendarza gregoriańskiego:

Typy danych daty/godziny umożliwiają przechowywanie dat w formacie gregoriańskim w zakresie dat 0001-01-01 CE do 9999-12-31 CE.

Domyślny format literału ciągu, który jest używany dla klientów na poziomie podrzędnym, jest zgodny ze standardowym formularzem SQL zdefiniowanym jako yyyy-MM-dd. Ten format jest taki sam jak definicja ISO 8601 dla programu DATE.

Note

Dla Informatica zakres jest ograniczony do 1582-10-15 (15 października 1582 CE) do 9999-12-31 (31 grudnia 9999 CE).

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_WSTR lub DBTYPE_STR Java.sql.String String lub SqString
date yyyy-MM-dd SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTR lub DBTYPE_STR Java.sql.String String lub SqString
datetime2 yyyy-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTR lub DBTYPE_STR Java.sql.String String lub SqString
datetimeoffset yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+ or -]hh:mm SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTR lub DBTYPE_STR Java.sql.String String lub SqString

Konwertowanie danych daty i godziny

Podczas konwertowania na typy danych daty i godziny program SQL Server odrzuca wszystkie wartości, które nie są rozpoznawane jako daty ani godziny. Aby uzyskać informacje o korzystaniu z funkcji CAST i CONVERT z danymi daty i godziny, zobacz CAST i CONVERT.

Konwertowanie daty na inne typy dat i godzin

W tej sekcji opisano, co się dzieje po przekonwertowaniu typu danych daty na inne typy danych daty i godziny.

Gdy konwersja ma wartość time(n), konwersja nie powiedzie się i zostanie zgłoszony komunikat o błędzie 206:

Starcie typu operandu: data jest niezgodna z godziną.

Jeśli konwersja to data/godzina, składnik daty zostanie skopiowany. Poniższy kod przedstawia wyniki konwertowania wartości daty na wartość typu data/godzina.

DECLARE @date AS DATE = '12-10-25';

DECLARE @datetime AS DATETIME = @date;

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

Oto zestaw wyników.

@date      @datetime
---------- -----------------------
2025-12-10 2025-12-10 00:00:00.000

Gdy konwersja ma wartość smalldatetime, wartość daty znajduje się w zakresie parametru smalldatetime, składnik daty jest kopiowany, a składnik godziny jest ustawiony na 00:00:00.000wartość . Gdy wartość daty znajduje się poza zakresem wartości smalldatetime , jest zgłaszany komunikat o błędzie 242, a wartość smalldatetime jest ustawiona na NULL:

Konwersja typu danych daty na typy danych smalldatetime spowodowała powstanie wartości poza zakresem.

Poniższy kod przedstawia wyniki konwertowania wartości daty na wartość smalldatetime .

DECLARE @date AS DATE = '1912-10-25';

DECLARE @smalldatetime AS SMALLDATETIME = @date;

SELECT @date AS '@date',
       @smalldatetime AS '@smalldatetime';

Oto zestaw wyników.

@date      @smalldatetime
---------- -------------------
1912-10-25 1912-10-25 00:00:00

W przypadku konwersji na datetimeoffset(n), data jest kopiowana, a godzina jest ustawiona na 00:00.0000000 +00:00. Poniższy kod przedstawia wyniki konwertowania wartości daty na wartość datetimeoffset(3).

DECLARE @date AS DATE = '1912-10-25';

DECLARE @datetimeoffset AS DATETIMEOFFSET (3) = @date;

SELECT @date AS '@date',
       @datetimeoffset AS '@datetimeoffset';

Oto zestaw wyników.

@date      @datetimeoffset
---------- ------------------------------
1912-10-25 1912-10-25 00:00:00.000 +00:00

Gdy konwersja ma wartość datetime2(n), składnik daty jest kopiowany, a składnik godziny jest ustawiony na 00:00.000000wartość . Poniższy kod przedstawia wyniki konwertowania wartości daty na wartość datetime2(3).

DECLARE @date AS DATE = '1912-10-25';

DECLARE @datetime2 AS DATETIME2 (3) = @date;

SELECT @date AS '@date',
       @datetime2 AS '@datetime2(3)';

Oto zestaw wyników.

@date      @datetime2(3)
---------- -----------------------
1912-10-25 1912-10-25 00:00:00.000

Konwertowanie literałów ciągu na datę

Konwersje z literałów ciągów do typów daty i godziny są dozwolone, jeśli wszystkie części ciągów mają prawidłowe formaty. 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 daty .

Literał ciągu wejściowego date
DATA ODBC Literały ciągu ODBC są mapowane na typ danych typu data/godzina . Każda operacja przypisania z literałów ODBC DATETIME do typu daty powoduje niejawną konwersję między datą/godziną a typem zdefiniowanym przez reguły konwersji.
CZAS ODBC Zobacz poprzednią regułę ODBC DATE.
ODBC DATETIME Zobacz poprzednią regułę ODBC DATE.
Tylko DATE Trivial
TYLKO CZAS Podano wartości domyślne.
Tylko TIMEZONE Podano wartości domyślne.
DATA I GODZINA Używana jest część DATE ciągu wejściowego.
DATA I STREFA CZASOWA Niedozwolone.
CZAS + STREFA CZASOWA Podano wartości domyślne.
DATA + GODZINA + STREFA CZASOWA Używana jest część DATE (DATA) lokalnego elementu DATETIME.

Examples

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

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