Функции по работе с датами и временем
Последнее обновление: 29.07.2017
T-SQL предоставляет ряд функций для работы с датами и временем:
- GETDATE: возвращает текущую локальную дату и время на основе системных часов в виде объекта datetime
1 |
SELECT GETDATE() -- 2017-07-28 21:34:55.830 |
- GETUTCDATE: возвращает текущую локальную дату и время по гринвичу (UTC/GMT) в виде объекта datetime
1 |
SELECT GETUTCDATE() -- 2017-07-28 18:34:55.830 |
- SYSDATETIME: возвращает текущую локальную дату и время на основе системных часов, но отличие от GETDATE состоит в том, что дата и время возвращаются в виде объекта datetime2
1 |
SELECT SYSDATETIME() -- 2017-07-28 21:02:22.7446744 |
- SYSUTCDATETIME: возвращает текущую локальную дату и время по гринвичу (UTC/GMT) в виде объекта datetime2
1 |
SELECT SYSUTCDATETIME() -- 2017-07-28 18:20:27.5202777 |
- SYSDATETIMEOFFSET: возвращает объект datetimeoffset(7), который содержит дату и время относительно GMT
1 |
SELECT SYSDATETIMEOFFSET() -- 2017-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()) -- 2017 |
- 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. Второй параметр - добавляемое количество. Третий параметр - сама дата, к которой надо сделать прибавление:
1
2
3 |
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 |
Если добавляемое количество представляет отрицательное число, то фактически происходит уменьшение даты.
- DATEDIFF: возвращает разницу между двумя датами. Первый параметр - компонент даты, который указывает, в каких единицах стоит измерять разницу. Второй и третий параметры - сравниваемые даты:
1
2
3 |
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 дней |
- TODATETIMEOFFSET: возвращает значение datetimeoffset, которое является результатом сложения временного смещения с другим объектом datetimeoffset
1 |
SELECT TODATETIMEOFFSET('2017-7-28 01:10:22', '+03:00') |
- SWITCHOFFSET: возвращает значение datetimeoffset, которое является результатом сложения временного смещения с объектом datetime2
1 |
SELECT SWITCHOFFSET(SYSDATETIMEOFFSET(), '+02:30') |
- EOMONTH: возвращает дату последнего дня для месяца, который используется в переданной в качестве параметра дате.
1
2 |
SELECT EOMONTH('2017-02-05') -- 2017-02-28
SELECT EOMONTH('2017-02-05', 3) -- 2017-05-31 |
В качестве необязательного второго параметра можно передавать количество месяцев, которые необходимо прибавить к дате. Тогда последний день месяца будет вычисляться для новой даты.
- DATEFROMPARTS: по году, месяцу и дню создает дату
1 |
SELECT DATEFROMPARTS(2017, 7, 28) -- 2017-07-28 |
- ISDATE: проверяет, является ли выражение датой. Если является, то возвращает 1, иначе возвращает 0.
1
2
3
4 |
SELECT ISDATE('2017-07-28') -- 1
SELECT ISDATE('2017-28-07') -- 0
SELECT ISDATE('28-07-2017') -- 0
SELECT ISDATE('SQL') -- 0 |
В качестве примера использования функций можно привести создание таблицы заказов, которая содержит дату заказа:
1
2
3
4
5
6
7
8
9 |
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 дней назад:
1
2 |
SELECT * FROM Orders
WHERE DATEDIFF(day, CreatedAt, GETDATE()) = 16 |
|