Функции по работе с датами и временем в SQL
SQL предоставляет ряд функций для работы с датами и временем:
- GETDATE: возвращает текущую локальную дату и время на основе системных часов в виде объекта datetime1
SELECT
GETDATE()
-- 2022-07-28 21:34:55.830
- GETUTCDATE: возвращает текущую локальную дату и время по гринвичу (UTC/GMT) в виде объекта datetime1
SELECT
GETUTCDATE()
-- 2022-07-28 18:34:55.830
- SYSDATETIME: возвращает текущую локальную дату и время на основе системных часов, но отличие от GETDATE состоит в том, что дата и время возвращаются в виде объекта datetime21
SELECT
SYSDATETIME()
-- 2022-07-28 21:02:22.7446744
- SYSUTCDATETIME: возвращает текущую локальную дату и время по гринвичу (UTC/GMT) в виде объекта datetime21
SELECT
SYSUTCDATETIME()
-- 2022-07-28 18:20:27.5202777
- SYSDATETIMEOFFSET: возвращает объект datetimeoffset(7), который содержит дату и время относительно GMT1
SELECT
SYSDATETIMEOFFSET()
-- 2022-07-28 21:02:22.7446744 +03:00
- DAY: возвращает день даты, который передается в качестве параметра1
SELECT
DAY
(GETDATE())
-- 28
- MONTH: возвращает месяц даты1
SELECT
MONTH
(GETDATE())
-- 7
- YEAR: возвращает год из даты1
SELECT
YEAR
(GETDATE())
-- 20
22 - DATENAME: возвращает часть даты в виде строки. Параметр выбора части даты передается в качестве первого параметра, а сама дата передается в качестве второго параметра:1
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)
- DATEPART: возвращает часть даты в виде числа. Параметр выбора части даты передается в качестве первого параметра (используются те же параметры, что и для DATENAME), а сама дата передается в качестве второго параметра:1
SELECT
DATEPART(
month
, GETDATE())
-- 7
- DATEADD: возвращает дату, которая является результатом сложения числа к определенному компоненту даты. Первый параметр представляет компонент даты, описанный выше для функции DATENAME. Второй параметр – добавляемое количество. Третий параметр – сама дата, к которой надо сделать прибавление:123
SELECT
DATEADD(
month
, 2,
'2022-7-28'
)
-- 2022-09-28 00:00:00.000
SELECT
DATEADD(
day
, 5,
'2022-7-28'
)
-- 2022-08-02 00:00:00.000
SELECT
DATEADD(
day
, -5,
'2022-7-28'
)
-- 2022-07-23 00:00:00.000
Если добавляемое количество представляет отрицательное число, то фактически происходит уменьшение даты. - DATEDIFF: возвращает разницу между двумя датами. Первый параметр – компонент даты, который указывает, в каких единицах стоит измерять разницу. Второй и третий параметры – сравниваемые даты:123
SELECT
DATEDIFF(
year
,
'2022-7-28'
,
'2018-9-28'
)
-- разница 1 год
SELECT
DATEDIFF(
month
,
'2022-7-28'
,
'2018-9-28'
)
-- разница 14 месяцев
SELECT
DATEDIFF(
day
,
'2022-7-28'
,
'2018-9-28'
)
-- разница 427 дней
- TODATETIMEOFFSET: возвращает значение datetimeoffset, которое является результатом сложения временного смещения с другим объектом datetimeoffset1
SELECT
TODATETIMEOFFSET(
'2022-7-28 01:10:22'
,
'+03:00'
)
- SWITCHOFFSET: возвращает значение datetimeoffset, которое является результатом сложения временного смещения с объектом datetime21
SELECT
SWITCHOFFSET(SYSDATETIMEOFFSET(),
'+02:30'
)
- EOMONTH: возвращает дату последнего дня для месяца, который используется в переданной в качестве параметра дате.12
SELECT
EOMONTH(
'2022-02-05'
)
-- 2022-02-28
SELECT
EOMONTH(
'2022-02-05'
, 3)
-- 2022-05-31
В качестве необязательного второго параметра можно передавать количество месяцев, которые необходимо прибавить к дате. Тогда последний день месяца будет вычисляться для новой даты. - DATEFROMPARTS: по году, месяцу и дню создает дату1
SELECT
DATEFROMPARTS(2022, 7, 28)
-- 2022-07-28
- ISDATE: проверяет, является ли выражение датой. Если является, то возвращает 1, иначе возвращает 0.1234
SELECT
ISDATE(
'2022-07-28'
)
-- 1
SELECT
ISDATE(
'2022-28-07'
)
-- 0
SELECT
ISDATE(
'28-07-2022'
)
-- 0
SELECT
ISDATE(
'SQL'
)
-- 0
В качестве примера использования функций можно привести создание таблицы заказов, которая содержит дату заказа:
123456789 | 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 дней назад:
12 | SELECT * FROM Orders WHERE DATEDIFF( day , CreatedAt, GETDATE()) = 16 |
https://t.me/sqlhub – sql с нуля до профи Функции по работе с датами и временем
+1
+1
+1
1
+1
+1