Як отримати дату з datetime SQL?
Функція EXTRACT витягує з дати та часу певний компонент. Її формальний синтаксис:
EXTRACT(unit FROM datetime)
Значення datetime представляє вихідну дату та (або) час, а значення unit вказує, який компонент дати чи часу витягуватиметься. Параметр unit може представляти одне з наступних значень:
- SECOND (секунди)
- MINUTE (хвилини)
- HOUR (година)
- DAY (день)
- MONTH (місяць)
- YEAR (рік)
- MINUTE_SECOND (хвилини та секунди)
- HOUR_MINUTE (годинник та хвилина)
- DAY_HOUR (день та годинник)
- YEAR_MONTH (рік та місяць)
- HOUR_SECOND (годинник, хвилина та секунда)
- DAY_MINUTE (день, години та хвилини)
- DAY_SECOND (день, години, хвилини та секунди)
Приклади виклику функції:
EXTRACT( SECOND FROM '2018-05-25 21:25:54')
EXTRACT(MINUTE FROM '2018-05-25 21:25:54')
EXTRACT( HOUR FROM '2018-05-25 21:25:54')
EXTRACT (DAY FROM '2018-05-25 21:25:54')
EXTRACT (MONTH FROM '2018-05-25 21:25:54')
EXTRACT(YEAR FROM '2018-05-25 21:25:54')
EXTRACT( MINUTE_SECOND FROM '2018-05-25 21:25:54')
EXTRACT (DAY_HOUR FROM '2018-05-25 21:25:54')
EXTRACT( YEAR_MONTH FROM '2018-05-25 21:25:54')
EXTRACT( HOUR_SECOND FROM '2018-05-25 21:25:54')
EXTRACT(DAY_MINUTE FROM '2018-05-25 21:25:54')
EXTRACT(DAY_SECOND FROM '2018-05-25 21:25:54')
Функції для маніпуляції із датами
Ряд функцій дозволяють проводити операції складання та віднімання з датами та часом:
- DATE_ADD(date, INTERVAL expression unit) повертає об'єкт DATE або DATETIME, який є результатом складання дати date з певним часовим інтервалом. Інтервал задається за допомогою виразу INTERVAL expression unit , де INTERVAL надає ключове слово, expression - кількість одиниць, що додаються до дати, а unit - тип одиниць (годинник, дні і т.д.) Параметр unit може мати ті ж значення, що і в функції EXTRACT, тобто DAY, HOUR і т.д.
- DATE_SUB(date, INTERVAL expression unit) повертає об'єкт DATE або DATETIME, який є результатом віднімання з дати date певного часового інтервалу
- DATEDIFF(date1, date2) повертає різницю в днях між датами date1 та date2
- TO_DAYS(date) повертає кількість днів із 0-го року
- TIME_TO_SEC(time) повертає кількість секунд, що минули з півночі
DATE_ADD('2018-05-25', INTERVAL 1 DAY)
DATE_ADD('2018-05-25', INTERVAL 3 MONTH)
DATE_ADD('2018-05-25 21:31:27', INTERVAL 4 HOUR)
DATE_SUB('2018-05-25', INTERVAL 4 DAY)
Форматування дат та часу
- DATE_FORMAT(date, format) повертає об'єкт DATE або DATETIME, відформатований за допомогою шаблону format
- TIME_FORMAT(date, format) повертає об'єкт TIME або DATETIME, відформатований за допомогою шаблону format
Обидві функції другого параметра приймають рядок форматування або шаблон, який показує, як оформатувати значення. Цей шаблон може приймати такі значення:
- %m : місяць у числовому форматі 01..12
- %с: місяць у числовому форматі 1..12
- %M: назва місяця (January. December)
- %b : абревіатура місяця (Jan. Dec)
- %d : день місяця у числовому форматі 00..31
- %e : день місяця у числовому форматі 0..31
- %D : номер місяця з суфіксом (1st, 2nd, 3rd. )
- %y : рік у вигляді двох чисел
- %Y : рік у вигляді чотирьох чисел
- %W : назва дня тижня (Sunday. Saturday)
- %a : абревіатура дня тижня (Sun. Sat)
- %H : година у форматі 00..23
- %k : година у форматі 0..23
- %h : година у форматі 01..12
- %l : година у форматі 1..12
- %i: хвилини у форматі 00..59
- %r : час у 12-годинному форматі (hh:mm:ss AM або PM)
- %T : час у 24-годинному форматі (hh:mm:ss)
- %S : секунди у форматі 00..59
- %p : AM або PM
DATE_FORMAT('2018-05-25 21:25:54', '%d %M %Y')
DATE_FORMAT('2018-05-25 21:25:54', '%r')
TIME_FORMAT('2018-05-25 21:25:54', '%H:%i:%S')
Як приклад використання функцій знайдемо замовлення, зроблені 5 днів тому:
SELECT * FROM Orders WHERE DATEDIFF(CURDATE(), CreatedAt) = 5;
datetime (Transact-SQL)
Визначає дату, що включає час дня з частками секунди у 24-годинному форматі.
Уникайте використання дати та часу для нової роботи Натомість використовуйте типи даних date, date, datetime2 і datetimeoffset . Ці типи відповідають стандарту SQL і більш переносимі. Типи time, datetime2 і datetimeoffset забезпечують більшу точність секунд. datetimeoffset забезпечує підтримку часових поясів для програм, що розгортаються по всьому світу.
Description
| Властивість |
Значення |
| Синтаксис |
DATETIME |
| Використання |
DECLARE @MyDatetime DATETIME; CREATE TABLE Table1 (Column1 DATETIME); |
| Формати рядкових літералів за замовчуванням (використовуються для клієнта нижнього рівня) |
Немає даних |
| Діапазон дати |
1753-01-01 (1 січня 1753 р.) до 9999-12-31 (31 грудня 9999 р.) |
| Діапазон часу |
Від 00:00:00 до 23:59:590,997 |
| Діапазон усунення часового поясу |
ні |
| Діапазони елементів |
yyyy - чотири цифри від 1753 9999 цього року. |
MM - це дві цифри, починаючи від 01 12 від , які представляють місяць у зазначеному році.
dd — дві цифри в 01 31 залежно від місяця, що становить день зазначеного місяця.
HH — це дві цифри, починаючи від 00 23 від , які є годиною.
mm — це дві цифри, починаючи від 00 59 від , які становлять хвилину.
ss — це дві цифри, починаючи від 00 59 від , які є другою.
Формати строкових літералів, що підтримуються, для типу даних datetime
У наведених нижче таблицях наводяться підтримувані формати рядкових літералів для типу даних datetime. За винятком ODBC, строкові літерали datetime знаходяться в окремих лапках ( 'наприклад, 'string_literaL'). Якщо середовище не us_english є, рядкові літерали повинні бути у форматі N'string_literaL' Юнікоду.
Числовий формат
Місяць у датах може вказуватися у числовому форматі. Наприклад, 5/20/97 представляє двадцятий день травня 1997 року.У разі використання формату числових дат вкажіть місяць, день і рік у рядку, який використовує знаки косої риси (), дефіси ( / - ) або точки ( . ) як роздільники. Цей рядок має виглядати так:
Якщо для мови задано us_english значення, за замовчуванням для дати встановлено значення mdy (місяць, день, рік). Можна змінити порядок дати за допомогою інструкції SET DATEFORMAT.
Параметр SET DATEFORMAT для визначення інтерпретації значень дати. Якщо порядок відповідає конфігурації, значення не обробляються як дати. Дати поза порядком можуть бути неправильно інтерпретовані як не в діапазоні або з неправильними значеннями. Наприклад, 12/10/08 можна інтерпретувати як одну із шести дат залежно від DATEFORMAT параметра. Чотирьохзначний рік інтерпретується як рік.
| Формат дати |
Порядок |
| [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 |
Алфавітний формат
Можна вказати дату із повним ім'ям місяця. Наприклад, April або скорочення Apr місяця, вказаного поточною мовою. Коми є необов'язковими, регістр літер не враховується.
Деякі рекомендації щодо застосування алфавітних форматів дати:
- Покладіть дані дати та часу в одинарні лапки ( ' ). Для мов, відмінних від англійської, використовуйте N'' .
- Символи, укладені у квадратні дужки, є необов'язковими.
- Якщо вказати лише останні дві цифри року, значення менше, ніж останні дві цифри значення параметра конфігурації відсікання двозначного року, перебувають у тому ж столітті, що й відсічений рік. Значення, великі або рівні двом останнім цифрам цього параметра, відносяться до сторіччя, що передує сторіччя року усічення. Наприклад, якщо відсікання двозначного року дорівнює 2050 (за замовчуванням), 25 інтерпретується як 2025 та 50 інтерпретується як 1950 . Щоб уникнути неоднозначності, використовуйте чотиризначний запис року.
- Якщо не вказано число місяця, мається на увазі перше число.
- Параметр SET DATEFORMAT сеансу не застосовується, якщо вказувати місяць у алфавітному форматі.
| В алфавітному порядку |
| 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] |
(У форматі ISO 8601).
Щоб використовувати формат ISO 8601, необхідно вказати кожен елемент у форматі, включаючи T двокрапка ( : ) та період ( . ), що відображається у форматі.
Квадратні дужки показують, що частки секунд є обов'язковими. Тимчасовий компонент вказаний у 24-годинному форматі. Вказує T початок періоду часу значення дати та часу .
Перевага використання формату ISO 8601 полягає в тому, що це міжнародний стандарт із однозначною специфікацією. Крім того, цей формат не впливає на параметр SET DATEFORMAT або SET LANGUAGE .
Формат unseparated
Цей формат аналогічний формату ISO 8601, за винятком того, що він не містить роздільників дат.
Формат ODBC
Інтерфейс API ODBC визначає керуючі послідовності, що представляють значення дати та часу, які називаються в ODBC мітками часу. Цей формат мітки часу ODBC також підтримується визначенням мови OLE DB (DBGUID-SQL), яку підтримує постачальник Microsoft OLE DB для SQL Server. Програми, які використовують ADO, OLE DB або API-інтерфейси, що базуються на ODBC, можуть використовувати цей формат позначок часу ODBC для представлення дати та часу.
Escape-послідовності міток часу ODBC мають формат: < '' >
- вказує тип escape-послідовності. Мітки часу мають три описники:
- d = лише дата
- t = лише час
- ts = мітка часу (час та дата)
- d : yyyy-MM-dd
- t : hh:mm:ss[.fff]
- ts : yyyy-MM-dd HH:mm:ss[.fff]
Округлення типу даних datetime до часток секунди
Значення datetime округляються до добавок 000, 003 або 007 секунд, як показано в наступному прикладі.
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/0 /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 :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 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 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 :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 01/01/2024 23:59:59.990' AS DATETIME);
Ось результуючий набір.
| Вказане користувачем значення |
Значення, яке зберігається системою |
| 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 |
Відповідність стандартам ANSI та ISO 8601
datetime не відповідає стандартам ANSI та ISO 8601.
Перетворення даних дати та часу
При перетворенні на типи даних дати та часу ядро СУБД відхиляє всі значення, які не можуть розпізнаватись як дати або час. Відомості про використання та CONVERT функцій з даними CAST дати та часу див. у розділі CAST та CONVERT.
Перетворення інших типів дат і часу на тип даних datetime
У цьому розділі описується, що відбувається при перетворенні інших типів дати і часу на тип даних datetime.
При перетворенні з типу date копіюються рік, місяць та день. Для компонента часу встановлено значення 00:00:00.000 . Наступний код демонструє результати перетворення значення DATE на значення DATETIME .
DECLARE @date DATE = '12-21-16'; DECLARE @datetime DATETIME = @date; SELECT @datetime AS '@datetime', @date AS '@date';
Ось результуючий набір.
@datetime @date ------------------------ ----------- 2016-12-21 00:00:00.000 2016 -12-21
У попередньому прикладі використовується формат певної дати регіону (MM-DD-YY).
DECLARE @date DATE = '12-21-16';
Ви повинні оновити приклад, щоб він відповідав формату вашого регіону.
Ви також можете виконати приклад із форматом дати відповідності ISO 8601 (yyyy-MM-dd). Наприклад:
DECLARE @date DATE = '2016-12-21'; DECLARE @datetime DATETIME = @date; SELECT @datetime AS '@datetime', @date AS '@date';
При перетворенні з часу (n)компонент часу копіюється, а для компонента дати встановлено значення 1900-01-01 . Якщо дрібна точність значення time(n) більше трьох цифр, значення усічено для відповідності. Наступний приклад показує результати перетворення значення TIME(4) значення DATETIME .
DECLARE @time TIME(4) = '12:10:05.1237'; DECLARE @datetime DATETIME = @time; SELECT @datetime AS '@datetime', @time AS '@time';
Ось результуючий набір.
@datetime @time ------------------------ -------------- 1900-01-01 12:10 :05.123 12:10:05.1237
При перетворенні з типу smalldatetime копіюються години та хвилини. Для секунд та дробових секунд встановлено значення 0 . Наступний код демонструє результати перетворення значення SMALLDATETIME на значення DATETIME .
DECLARE @smalldatetime SMALLDATETIME = '12-01-16 12:32'; DECLARE @datetime DATETIME = @smalldatetime; SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';
Ось результуючий набір.
@datetime @smalldatetime ------------------------ -------------------- 2016- 12-01 12:32:00.000 2016-12-01 12:32:00
При перетворенні з datetimeoffset(n) копіюються компоненти дати та часу. Часовий пояс усікається. Якщо дрібна точність значення datetimeoffset(n) більше трьох цифр, значення усічено. Наступний приклад показує результати перетворення значення DATETIMEOFFSET(4) значення 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';
Ось результуючий набір.
@datetime @datetimeoffset ------------------------ ---------------------- --------- 1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237 +10:0
При перетворенні з datetime2(n) копіюються дата та час. Якщо дрібна точність значення datetime2(n) більше трьох цифр, значення усічено. Наступний приклад показує результати перетворення значення DATETIME2(4) значення DATETIME .
DECLARE @datetime2 DATETIME2(4) = '1968-10-23 12:45:37.1237'; DECLARE @datetime DATETIME = @datetime2; SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';
Ось результуючий набір.
@datetime @datetime2 ------------------------ ---------------------- --- 1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
Приклади
У наведеному нижче прикладі порівнюються результати приведення рядкового типу до кожного з типів даних date і time.
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 D ) 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( -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
Ось результуючий набір.
| Тип даних |
Вихідні дані |
| 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 |
Пов'язаний контент