date (Transact-SQL)
Область застосування: SQL Server База даних SQL Azure Керований екземпляр SQL Azure кінцевій точці аналітики платформи Аналітики Azure Synapse Analytics (PDW) в Microsoft Fabric Сховище в базі даних Microsoft Fabric SQL в Microsoft Fabric
Визначає дату SQL Server. Тип даних дати з'явився у SQL Server 2008 (10.0.x).
Опис типу даних date
| Властивість |
Значення |
| Синтаксис |
DATE |
| Використання |
DECLARE @MyDate DATE
|
MM - це дві цифри від 01 12 того, що становить місяць у зазначеному році.
Формати строкових літералів, що підтримуються, для типу даних date
У наступних списках показані допустимі формати рядкових літералів для типу даних дати .
[m]m , dd і [yy]yy представляє місяць, день і рік у рядку зі знаками косої межі (), дефісами ( / - ) або періодами ( . ) як роздільники.
Підтримуються лише чотири цифри або двозначні роки. Для запису року рекомендується використовувати чотиризначний формат. Щоб вказати ціле число від 0001 9999 того, що є відрізком року для інтерпретації двозначних років у вигляді чотиризначних років, використовуйте параметр конфігурації сервера відсікання двозначного року.
Для Informatica yyyy обмежений діапазоном 1582 9999 .
Якщо двозначне число, що позначає рік, менше або дорівнює двозначному числу з двох останніх цифр порогового року, рік відноситься до того ж століття, що і пороговий рік. Якщо двозначне число, що позначає рік, більше за двозначне число з останніх двох цифр порогового року, рік відноситься до століття, яке передує століттю порогового року. Наприклад, якщо двозначний відрізок року є стандартним 2049, двозначний рік 49 інтерпретується як 2049 і двозначний рік 50 інтерпретується як 1950.
Поточний параметр мовлення визначає формат дати за замовчуванням. Формат дати можна змінити за допомогою інструкцій SET LANGUAGE та SET DATEFORMAT.
Формат ydm не підтримується для дати.
Формати строкових літералів для місячного року
SET DATEFORMAT mdy;
Формати строкових літералів для місячного дня
SET DATEFORMAT myd;
Формати рядкових літералів для денного місяця
SET DATEFORMAT dmy;
Формати рядкових літералів для денного місяця
SET DATEFORMAT dym;
Формати рядкових літералів для дня року
SET DATEFORMAT ymd;
Алфавітний перелік форматів
- [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 представляє повне ім'я місяця або скорочене значення місяця, задане поточною мовою. Коми є необов'язковими, регістр літер не враховується.
Щоб уникнути неоднозначності, використовуйте чотиризначний запис року.
Якщо не вказано число місяця, мається на увазі перше число.
Список форматів ISO 8601
Те саме, що і стандарт SQL. Цей формат є єдиним міжнародним стандартом.
Некерований список форматів
Дані типу date можуть бути визначені за допомогою чотирьох, шести чи восьми цифр. Шестизначний або восьмизначний рядок завжди інтерпретується як ymd. На місяць та день завжди має припадати по дві цифри. Чотиризначний рядок інтерпретується як рік.
Формат дати ODBC
Залежить від інтерфейсу API ODBC.
Формат дати W3C XML
Введений для використання в XML та SOAP.
TZD - це конструктор часового поясу (Z або -hh:mm +hh:mm):
- hh:mm представляє усунення часового поясу. hh — дві цифри, починаючи від 0 14 від , які становлять кількість годин на зміщення часового поясу.
- mm — це дві цифри, починаючи від 0 59 від , які становлять кількість додаткових хвилин у зміщення часового поясу.
- + (плюс) або - (мінус) є обов'язковою ознакою усунення часового поясу. Цей знак вказує, додається або віднімається зміщення часового поясу від часу у форматі UTC, щоб отримати локальний час. Допустимий діапазон зміщення часового поясу - від -14:00. +14:00
Відповідність стандартам ANSI та ISO 8601
Значення date відповідає стандартному визначенню ANSI SQL для григоріанського календаря:
Типи даних Datetime дозволяють зберігати дати у григоріанському форматі в діапазоні дат 0001-01-01CE до 9999-12-31CE.
Формат рядкового літералу за замовчуванням, який використовується для клієнтів нижнього рівня, відповідає стандартній формі SQL, визначеній як yyyy-MM-dd. Цей формат збігається з визначенням ISO 8601 для DATE.
Для Informatica діапазон обмежений 1582-10-15 (15 жовтня 1582 CE) до 9999-12-31 (31 грудня 9999 CE).
Зворотна сумісність для клієнтів нижнього рівня
Деякі клієнти нижнього рівня не підтримують типи даних time, date, datetime2 і datetimeoffset. У наступній таблиці показано зіставлення типів між екземпляром SQL Server та клієнтами нижнього рівня.
| Тип даних SQL Server |
Формат рядкового літералу за промовчанням, що передається клієнту низького рівня |
ODBC низького рівня |
OLEDB низького рівня |
JDBC низького рівня |
SQLCLIENT низького рівня |
| time |
hh:mm:ss[.nnnnnnn] |
SQL_WVARCHAR або SQL_VARCHAR |
DBTYPE_WSTR або DBTYPE_STR |
Java.sql.String |
String або SqString |
| date |
yyyy-MM-dd |
SQL_WVARCHAR або SQL_VARCHAR |
DBTYPE_WSTR або DBTYPE_STR |
Java.sql.String |
String або SqString |
| datetime2 |
yyyy-MM-dd HH:mm:ss[.nnnnnnn] |
SQL_WVARCHAR або SQL_VARCHAR |
DBTYPE_WSTR або DBTYPE_STR |
Java.sql.String |
String або SqString |
| datetimeoffset |
yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+ or -]hh:mm |
SQL_WVARCHAR або SQL_VARCHAR |
DBTYPE_WSTR або DBTYPE_STR |
Java.sql.String |
String або SqString |
Перетворення даних дати та часу
При перетворенні на типи даних дати і часу SQL Server відхиляє всі значення, які не розпізнаються як дати або час. Відомості про використання та CONVERT функцій з даними CAST дати та часу див. у розділі CAST та CONVERT.
Перетворення дати на інші типи дат і часу
У цьому розділі описується, що відбувається при перетворенні типу даних date в інші типи дати та часу.
При перетворенні на time(n)перетворення завершується помилкою і виникає повідомлення про помилку 206:
Зіткнення типів операнда: дата несумісна з часом.
Якщо перетворення дорівнює datetime, компонент дати копіюється. У наступному коді показано результати перетворення значення дати в значення datetime .
DECLARE @date AS DATE = '12-10-25'; DECLARE @datetime AS DATETIME = @date; SELECT @date AS '@date', @datetime AS '@datetime';
Ось результуючий набір.
@date @datetime ---------- ----------------------- 2025-12-10 2025-12-10 00:00 :00.000
При перетворенні У малійданому часі значення дати знаходиться в діапазоні короткийчасу., компонент дати копіюється, а для компонента часу встановлено значення . 00:00:00.000 Якщо значення дати виходить за межі діапазону значення smalldatetime, виникає повідомлення про помилку 242, а значення smalldatetime має NULL значення:
Перетворення типу даних дати на типи даних малогочасу призвело до значення поза діапазоном.
У наступному коді показано результати перетворення значення дати в значення smalldatetime .
DECLARE @date AS DATE = '1912-10-25'; DECLARE @smalldatetime AS SMALLDATETIME = @date; SELECT @date AS '@date', @smalldatetime AS '@smalldatetime';
Ось результуючий набір.
@date @smalldatetime ---------- ------------------- 1912-10-25 1912-10-25 00:00:00
Для перетворення на datetimeoffset(n)дата копіюється, а час - 00:00.0000000 +00:00. У наступному коді показано результати перетворення значення дати в значення datetimeoffset(3).
DECLARE @date AS DATE = '1912-10-25'; DECLARE @datetimeoffset AS DATETIMEOFFSET(3) = @date; SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset';
Ось результуючий набір.
@date @datetimeoffset ---------- ------------------------------ 1912-10-25 1912 -10-25 00:00:00.000 +00:00
При перетворенні на datetime2(n)компонент дати копіюється, а для компонента часу встановлено значення 00:00.000000 . У наступному коді показано результати перетворення значення дати в значення datetime2(3).
DECLARE @date AS DATE = '1912-10-25'; DECLARE @datetime2 AS DATETIME2 (3) = @date;
Ось результуючий набір.
@date @datetime2(3) ---------- ----------------------- 1912-10-25 1912-10-25 00:00:00.000
Перетворення рядкових літералу на дату
Перетворення рядкових літералів у типи даних дати та часу дозволяється, якщо всі частини рядків записані в допустимому форматі. Інакше виникає помилка часу виконання. поточного сеансу У таблиці нижче наводяться правила перетворення рядкових літералів на тип даних. date.
| Рядковий літерал входу |
Дата |
| ODBC DATE |
Рядкові літерали ODBC порівнюються з типом даних datetimeБудь-яка операція присвоювання літералів ODBC DATETIME типу даних date викликає неявне перетворення між даним типом та типом datetime згідно з правилами перетворення. |
| ODBC TIME |
Попереднє правило ODBC DATE. |
| ODBC DATETIME |
Попереднє правило ODBC DATE. |
| тільки DATE |
Найпростіший. |
| тільки TIME |
Вказано значення за замовчуванням. |
| тільки TIMEZONE |
Вказано значення за замовчуванням. |
| DATE + TIME |
Використовується компонент DATE вхідного рядка. |
| DATE + TIMEZONE |
Заборонено. |
| TIME + TIMEZONE |
Вказано значення за замовчуванням. |
| DATE + TIME + TIMEZONE |
Використовується частина DATE локального DATETIME. |
Приклади
У наведеному прикладі порівнюються результати приведення рядкового типу до кожного з типів даних date і time.
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 D ) 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 ('2 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 '
Ось результуючий набір.
| Тип даних |
Вихідні дані |
| 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 |
Пов'язаний контент
Як зробити дату SQL?
T-SQL надає ряд функцій для роботи з датами та часом:
GETDATE : повертає поточну локальну дату та час на основі системного годинника у вигляді об'єкта datetime
SELECT GETDATE() -- 2017-07-28 21:34:55.830
SELECT GETUTCDATE() -- 2017-07-28 18:34:55.830
SELECT SYSDATETIME() -- 2017-07-28 21:02:22.7446744
SELECT SYSUTCDATETIME() -- 2017-07-28 18:20:27.5202777
SELECT SYSDATETIMEOFFSET() -- 2017-07-28 21:02:22.7446744 +03:00
SELECT DAY(GETDATE()) - 28
SELECT MONTH(GETDATE()) - 7
SELECT YEAR(GETDATE()) - 2017
SELECT DATENAME(month, GETDATE()) -- July
- year (yy, yyyy): рік
- quarter (qq, q): квартал
- month (mm, m): місяць
- dayofyear (dy, y) : день року
- day (dd, d) : день місяця
- week (wk, ww) : тиждень
- weekday (dw) : день тижня
- hour (hh) : година
- minute (mi, n): хвилина
- second (ss, s): секунда
- millisecond (ms) : мілісекунда
- microsecond (mcs) : мікросекунда
- nanosecond (ns) : наносекунда
- tzoffset (tz) : змішування в хвилинах щодо грінвіча (для об'єкта datetimeoffset)
SELECT DATEPART(month, GETDATE()) - 7
SELECT DATEADD(month, 2, '2017-7-28') -- 2017-09-28 00:00:00.000 SELECT DATEADD(day, 5, '2017-7-28') -- 2017-08-02 00 :00:00.000 SELECT DATEADD(day, -5, '2017-7-28') - 2017-07-23 00:00:00.000
SELECT DATEDIFF(year, '2017-7-28', '2018-9-28') -- різниця 1 рік SELECT DATEDIFF(month, '2017-7-28', '2018-9-28') -- різниця 14 місяців SELECT DATEDIFF(day, '2017-7-28', '2018-9-28') -- різниця 427 днів
SELECT TODATETIMEOFFSET('2017-7-28 01:10:22', '+03:00')
SELECT SWITCHOFFSET(SYSDATETIMEOFFSET(), '+02:30')
SELECT EOMONTH('2017-02-05') - 2017-02-28 SELECT EOMONTH('2017-02-05', 3) - 2017-05-31
SELECT DATEFROMPARTS(2017, 7, 28) - 2017-07-28
SELECT ISDATE('2017-07-28') -- 1 SELECT ISDATE('2017-28-07') -- 0 SELECT ISDATE('28-07-2017') -- 0 SELECT ISDATE('SQL') - - 0
Як приклад використання функцій можна навести створення таблиці замовлень, що містить дату замовлення:
CREATE TABLE Orders ( Id INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL, CustomerId INT NOT NULL, CreatedAt DATE NOT NULL DEFAULT GETDATE(), ProductCount INT DEFAULT 1, Price MONEY NOT NULL );
Вираз DEFAULT GETDATE() вказує, що якщо при додаванні даних не передається дата, вона автоматично обчислюється за допомогою функції GETDATE().
Інший приклад – знайдемо замовлення, які були зроблені 16 днів тому:
SELECT * FROM Orders WHERE DATEDIFF(day, CreatedAt, GETDATE()) = 16