Как вычесть время в 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;
SQL-Ex blog
Функции даты в SQL Server, Oracle и PostgreSQL
Добавил Sergey Moiseenko on Суббота, 19 марта. 2022
Функции даты весьма полезны для выполнения различных операций с датами, используемых как для фильтрации, так и форматирования дат в запросах. К сожалению, имеются различия в реализации этих функций в SQL Server, Oracle и PostgreSQL, которым и посвящена эта статья.
В этом руководстве мы рассмотрим некоторые основные функции даты, различные возможности их применения, лучшую практику и различие в выполнении операций с датами в SQL Server, Oracle и PostgreSQL, а также различие типов данных Date и Time.
Различные типы данных даты и времени
Сначала давайте взглянем на различные типы данных, перечисленные в следующей таблице:
SQL Server

Oracle

PostgreSQL

Простые операции с датами
Как видим, уже имеются некоторые отличия в рассматриваемых типах данных. Давайте теперь рассмотрим простые операции с датами. Как всегда, мы будем использовать бесплатно загружаемый образец базы данных github Chinook, поскольку он доступен в нескольких форматах СУБД по этой ссылке: https://github.com/cwoodruff/ChinookDatabase. Эта база представляет собой симуляцию магазина цифровых медиа с некоторым набором данных. Все что вам нужно сделать, это загрузить подходящую версию, и вы получите необходимые скрипты для создания структуры данных и вставки всех данных.
SQL Server
Наиболее частой операцией с датами является получение актуального значения даты-времени. В SQL Server это легко делается с помощью функции getdate(), которая возвращает текущее значение даты-времени.
select getdate() as actual_date

Это легко, и при этом возвращается фактические дата и время. Но что если вы хотите отформатировать это значение, чтобы выводилась только дата? Тогда мы можем выполнить преобразование результата:
select cast(getdate() as date) as actual_date

Кроме того, имеется стандартная функция (ANSI SQL), которая делает то же самое:
select CURRENT_TIMESTAMP

Oracle
Если мы попытаемся сделать то же самое в Oracle, то придем к совершенно другим функциям. Во-первых, для получения актуальной даты/времени мы должны использовать функцию sysdate:
select sysdate as actual_date from dual;
Помним также, что в Oracle нельзя выполнять запрос без предложения FROM, поэтому мы всегда добавляем предложение from dual.

Помимо этого, в Oracle возвращаемый результат зависит от национального форматирования сессии, именно поэтому сейчас мы видим только дату. Но если мы применим форматирование даты:
select to_char(sysdate, 'dd-mm-yyyy hh24:mi:ss') as actual_date from dual;

то увидим как дату, так и время. А если захотим получить только дату, используется функция trunc:
select to_char(trunc(sysdate), 'dd-mm-yyyy hh24:mi:ss') as actual_date from dual;

PostgreSQL
В PostgreSQL у нас имеется другая функция или, более точно, более одной функции, и все они соответствуют стандарту ANSI SQL. Например, вы можем вернуть текущую дату и время с помощью CURRENT_TIMESTAMP:
SELECT CURRENT_TIMESTAMP;

Если потребуется вернуть время с меньшей точностью, мы можем использовать ту же функцию с точностью в скобках:
SELECT CURRENT_TIMESTAMP(0);

Обратите внимание, что при использовании CURRENT_TIMESTAMP также выводится часовой пояс.
Если мы хотим вернуть только дату или время, в PostgreSQL имеются следующие функции:
SELECT CURRENT_DATE;

SELECT CURRENT_TIME;

Добавить и вычесть из даты
Теперь давайте выполним некоторые операции с этими датами, одной из наиболее востребованных является добавление или вычитание некоторой величины времени к/из даты.
SQL Server
Для этой цели в SQL Server у нас имеется функция DATEADD. Давайте рассмотрим пример, добавляющий 5 дней к фактической дате:
select dateadd(d,5,getdate()) as actual_5_days

По синтаксису: первый параметр — это интервал, он может быть днями, годами, месяцами, неделями и т.д. Второй параметр представляет собой число, которое нужно добавить, и, наконец, дата, к которой добавляется данное число интервалов.
Предположим теперь, что нам нужно добавить 5 дней к фактической дате, но выводить время нам не нужно, только дату. Мы должны преобразовать результат функции GETDATE(), как мы это делали раньше.
select dateadd(d,5,cast(getdate() as date)) as actual_5_days

Пусть теперь нам нужно добавить 7 дней к дате счета в таблице Invoice базы данных Chinook, чтобы получить дату оплаты счетов на сумму более 20 евро:
select Invoicedate, dateadd(d,7,Invoicedate) as PaymentDate, Total
from Invoice
where total>20

Довольно легко, нет? Теперь предположим, что нам нужно вычесть неделю из фактической даты:
select dateadd(WEEK,-1,cast(getdate() as date)) as week_before

Обратите внимание, что мы используем ту же функцию DATEADD() также и для вычитания, но с использованием отрицательного числа!
Oracle
Теперь попробуем выполнить те же самые операции в Oracle. Сначала добавим 5 дней к фактической дате:
select sysdate+5 as actual_5_days from dual;

Как видно, в Oracle это сделать очень просто — вы просто используете + для добавления интервала. Как вы могли заметить, число здесь представляет дни, поэтому, если мы хотим добавить час, то можем сделать это с помощью дробной части:
select to_char(sysdate+1/24,'dd/mm/yyyy hh24:mm:ss') as actual_1_hour from dual;

Как и ранее, если нам нужна только дата, мы используем функцию TRUNC:
select to_char(TRUNC(sysdate)+5,'dd/mm/yyyy hh24:mm:ss') as actual_5_DAYS from dual;

Теперь давайте, как и для SQL Server, добавим 7 дней к дате счета:
select Invoicedate, Invoicedate+7 as PaymentDate, Total
from chinook.Invoice
where total>20

Очень легко, а теперь вычтем неделю:
select sysdate as actual, sysdate-7 as week_before from dual;

Мы можем такте применить все то форматирование, которое мы видели ранее:
select to_char(sysdate,'mm/dd/yyyy') as actual, to_char(sysdate-7,'mm/dd/yyyy') as week_before from dual;

PostgreSQL
Теперь в PostgreSQL:
select current_date as actual_date, current_date+5 as actual_5_days;

И опять здесь мы встречаем почти синтаксис Oracle, заметная разница имеется в способе, которым мы можем определить интервалы времени, отличные от 1 дня:
select current_timestamp as actual_date, current_timestamp+interval '1 hour' as actual_1_hour;

Давайте теперь добавим 7 дней к InvoiceDate. Обратите внимание, что, поскольку столбец InvoiceDate имеет тип данных timestamp, нам нужно задать интервал; если бы мы просто написали 7, то получим ошибку.
select "InvoiceDate","InvoiceDate"+ interval '7 days' as PaymentDate, "Total"
from "Invoice"
where "Total">20

Аналогично для вычитания:
select current_date as actual_date, current_date -7 as date_week_before

Имея функцию current_date, которая возвращает тип данных date, я могу просто использовать целое число, и оно будет неявно полагаться днями. Если вместо этого использовать current_timestamp, нам необходимо будет указывать интервал:
select current_timestamp as actual_date, current_timestamp - interval '7 days' as date_week_before

Диапазон времени между двумя датами
Другой общей операцией с датами является получение интервала времени между двумя датами.
SQL Server
Для этой цели в SQL Server используется функция DATEDIFF. Предположим, что нам необходимо получить среднее время, прошедшее между одной покупкой и следующей (следующая строка) для каждого клиента. Я использую готовый код, применяющий оконные функции, но объясняю только синтаксис SELECT DATEDIFF:
;WITH InvCust AS
(SELECT DISTINCT CustomerID,
InvoiceDate AS cur_d,
next_d = LEAD(InvoiceDate, 1) OVER (PARTITION BY CustomerID ORDER BY InvoiceDate)
FROM Invoice)
,customer_avg as
(SELECT CustomerID,cur_d
,next_d
,dif_day = DATEDIFF(DAY, cur_d, next_d)
,avg_cust = AVG(DATEDIFF(DAY, cur_d, next_d)) OVER (PARTITION BY CustomerID)
,avg_all = AVG(DATEDIFF(DAY, cur_d, next_d)) OVER ()
FROM InvCust)
select distinct customer.customerid, FirstName + ' ' + lastname as Customer, country,avg_cust, avg_all
from customer_avg
inner join customer
on Customer.CustomerId=customer_avg.CustomerId
order by avg_cust

Итак, функция DATEDIFF довольно простая, т.к. мы должны только задать единицы, в которых мы хотим получить разницу, затем первую дату и вторую дату.
Oracle
WITH InvCust AS
(SELECT DISTINCT CustomerID,
InvoiceDate AS cur_d, LEAD(InvoiceDate, 1) OVER (PARTITION BY CustomerID ORDER BY InvoiceDate) as next_d
FROM chinook.Invoice)
,customer_avg as
(SELECT CustomerID,cur_d, next_d
,(next_d-cur_d)as dif_day, AVG((next_d-cur_d)) OVER (PARTITION BY CustomerID) as avg_cust
,AVG(next_d-cur_d) OVER () as avg_all
FROM InvCust)
select distinct customer.customerid,FirstName||' '||lastname as Customer, country,cast(avg_cust as decimal(5,2)) as avg_customer, cast(avg_all as decimal(5,2)) as avg_allcust
from customer_avg
inner join chinook.customer
on Customer.CustomerId=customer_avg.CustomerId
order by avg_customer, customerid;

В Oracle все еще проще, просто вычитание одной даты из другой, и вы автоматически получаете разницу в днях!
PostgreSQL
WITH InvCust AS
(SELECT DISTINCT "CustomerId",
"InvoiceDate" AS cur_d, LEAD("InvoiceDate", 1) OVER (PARTITION BY "CustomerId" ORDER BY "InvoiceDate") as next_d
FROM "Invoice")
,customer_avg as
(SELECT "CustomerId",cur_d, next_d
,next_d-cur_d as dif_day, AVG(next_d-cur_d) OVER (PARTITION BY "CustomerId") as avg_cust
,AVG(next_d-cur_d) OVER () as avg_all
FROM InvCust)
select distinct "Customer"."CustomerId","FirstName"||' '||"LastName" as Customer, "Country",avg_cust, avg_all
from customer_avg
inner join "Customer"
on "Customer"."CustomerId"=customer_avg."CustomerId"
order by avg_cust;

И то же самое в PostgreSQL, хотя в этой СУБД мы также имеем функцию AGE. Поэтому давайте напишем тот же запрос с использованием этой функции:
WITH InvCust AS
(SELECT DISTINCT "CustomerId",
"InvoiceDate" AS cur_d, LEAD("InvoiceDate", 1) OVER (PARTITION BY "CustomerId" ORDER BY "InvoiceDate") as next_d
FROM "Invoice")
,customer_avg as
(SELECT "CustomerId",cur_d,next_d
,age(next_d,cur_d) as dif_day,AVG(age(next_d,cur_d)) OVER (PARTITION BY "CustomerId") as avg_cust
,AVG(age(next_d,cur_d)) OVER () as avg_all
FROM InvCust)
select distinct "Customer"."CustomerId","FirstName"||' '||"LastName" as Customer, "Country",avg_cust, avg_all
from customer_avg
inner join "Customer"
on "Customer"."CustomerId"=customer_avg."CustomerId"
order by avg_cust;

Как видно, результат представлен уже не в днях, а преобразуется в месяцы и годы (если интервал достаточно велик). Подобный результат мы можем получить вычетанием из current_date:
select age(timestamp'2014-01-01')

Обратите внимание, что мы передаем дату в формате штампа времени, используя функцию timestamp вместе с литералом даты.
Извлечение из даты компоненты даты
Другой обычной операцией, которую мы выполняем с датами является извлечение из даты её компоненты, например, года или месяца.
SQL Server
В SQL Server для этого мы можем использовать по сути 4 различных функции, в зависимости от того, что мы хотим получить, но очевидно, что практически все можно сделать с функцией DATEPART:
SELECT getdate() as actual_date,
DATEPART(d,getdate()) as date_day,
DATEPART(month,getdate()) as date_month,
DATEPART(year,getdate()) as date_year

Как видно, это довольно легко, просто укажите требуемую компоненту даты, дату, и все сделано! Но этого можно достичь также и другим способом:
SELECT getdate() as actual_date,
day(getdate()) as date_day,
month(getdate()) as date_month,
year(getdate()) as date_year

Те же результаты, используя непосредственно функции DAY, MONTH и YEAR.
Oracle
В Oracle мы получаем те же результаты с помощью функции EXTRACT:
SELECT SYSDATE AS ACTUAL_DATE,
EXTRACT(DAY FROM SYSDATE) AS ACTUAL_DAY,
EXTRACT(MONTH FROM SYSDATE) AS ACTUAL_MONTH,
EXTRACT(YEAR FROM SYSDATE) AS ACTUAL_YEAR FROM DUAL;

Довольно просто, и почти тот же синтаксис, что и в SQL Server!
PostgreSQL
В PostgreSQL имеется по сути 2 функции, чтобы сделать одно и то же, так как у нас имеется и date_part, и extract:
SELECT current_date AS ACTUAL_DATE,
EXTRACT(DAY FROM current_date) AS ACTUAL_DAY,
EXTRACT(MONTH FROM current_date) AS ACTUAL_MONTH,
EXTRACT(YEAR FROM current_date) AS ACTUAL_YEAR

Это в точности тот же синтаксис, как и в Oracle, а теперь date_part:
SELECT current_date AS ACTUAL_DATE,
date_part('day',current_date) AS ACTUAL_DAY,
date_part('month', current_date) AS ACTUAL_MONTH,
date_part('year', current_date) AS ACTUAL_YEAR

Незначительное отличие от синтаксиса SQL Server, но почти то же самое. Заметим, что функцией стандарта ANSI SQL в данном случае является EXTRACT.
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
Функции для работы с датами и временем
Все функции по работе с датой и временем, для которых это имеет смысл, могут принимать второй, необязательный аргумент — имя часового пояса. Пример: Asia/Yekaterinburg. В этом случае, они используют не локальный часовой пояс (по умолчанию), а указанный.
SELECT toDateTime('2016-06-15 23:00:00') AS time, toDate(time) AS date_local, toDate(time, 'Asia/Yekaterinburg') AS date_yekat, toString(time, 'US/Samoa') AS time_samoa
┌────────────────time─┬─date_local─┬─date_yekat─┬─time_samoa──────────┐ │ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-16 │ 2016-06-15 09:00:00 │ └─────────────────────┴────────────┴────────────┴─────────────────────┘
timeZone
Возвращает часовой пояс сервера, считающийся умолчанием для текущей сессии: значение параметра session_timezone, если установлено.
Если функция вызывается в контексте распределенной таблицы, то она генерирует обычный столбец со значениями, актуальными для каждого шарда. Иначе возвращается константа.
Синтаксис
timeZone()
Возвращаемое значение
Смотрите также
serverTimeZone
Возвращает часовой пояс сервера по умолчанию, в т.ч. установленный timezone Если функция вызывается в контексте распределенной таблицы, то она генерирует обычный столбец со значениями, актуальными для каждого шарда. Иначе возвращается константа.
Синтаксис
serverTimeZone()
Возвращаемое значение
Смотрите также
toTimeZone
Переводит дату или дату с временем в указанный часовой пояс. Часовой пояс — это атрибут типов Date и DateTime . Внутреннее значение (количество секунд) поля таблицы или результирующего столбца не изменяется, изменяется тип поля и, соответственно, его текстовое отображение.
Синтаксис
toTimezone(value, timezone)
Аргументы
- value — время или дата с временем. DateTime64.
- timezone — часовой пояс для возвращаемого значения. String. Этот аргумент является константой, потому что toTimezone изменяет часовой пояс столбца (часовой пояс является атрибутом типов DateTime* ).
Возвращаемое значение
Пример
SELECT toDateTime('2019-01-01 00:00:00', 'UTC') AS time_utc, toTypeName(time_utc) AS type_utc, toInt32(time_utc) AS int32utc, toTimeZone(time_utc, 'Asia/Yekaterinburg') AS time_yekat, toTypeName(time_yekat) AS type_yekat, toInt32(time_yekat) AS int32yekat, toTimeZone(time_utc, 'US/Samoa') AS time_samoa, toTypeName(time_samoa) AS type_samoa, toInt32(time_samoa) AS int32samoa FORMAT Vertical;
Row 1: ────── time_utc: 2019-01-01 00:00:00 type_utc: DateTime('UTC') int32utc: 1546300800 time_yekat: 2019-01-01 05:00:00 type_yekat: DateTime('Asia/Yekaterinburg') int32yekat: 1546300800 time_samoa: 2018-12-31 13:00:00 type_samoa: DateTime('US/Samoa') int32samoa: 1546300800
toTimeZone(time_utc, ‘Asia/Yekaterinburg’) изменяет тип DateTime(‘UTC’) в DateTime(‘Asia/Yekaterinburg’) . Значение (unix-время) 1546300800 остается неизменным, но текстовое отображение (результат функции toString()) меняется time_utc: 2019-01-01 00:00:00 в time_yekat: 2019-01-01 05:00:00 .
timeZoneOf
Возвращает название часового пояса для значений типа DateTime и DateTime64.
Синтаксис
timeZoneOf(value)
Аргументы
- value — Дата с временем. DateTime или DateTime64.
Возвращаемое значение
- Название часового пояса.
Пример
SELECT timezoneOf(now());
┌─timezoneOf(now())─┐ │ Etc/UTC │ └───────────────────┘
timeZoneOffset
Возвращает смещение часового пояса в секундах от UTC. Функция учитывает летнее время и исторические изменения часовых поясов, которые действовали на указанную дату. Для вычисления смещения используется информация из базы данных IANA.
Синтаксис
timeZoneOffset(value)
Аргументы
- value — Дата с временем. DateTime or DateTime64.
Возвращаемое значение
- Смещение в секундах от UTC.
Пример
SELECT toDateTime('2021-04-21 10:20:30', 'Europe/Moscow') AS Time, toTypeName(Time) AS Type, timeZoneOffset(Time) AS Offset_in_seconds, (Offset_in_seconds / 3600) AS Offset_in_hours;
┌────────────────Time─┬─Type──────────────────────┬─Offset_in_seconds─┬─Offset_in_hours─┐ │ 2021-04-21 10:20:30 │ DateTime('Europe/Moscow') │ 10800 │ 3 │ └─────────────────────┴───────────────────────────┴───────────────────┴─────────────────┘
toYear
Переводит дату или дату-с-временем в число типа UInt16, содержащее номер года (AD).
toQuarter
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер квартала.
toMonth
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер месяца (1-12).
toDayOfYear
Переводит дату или дату-с-временем в число типа UInt16, содержащее номер дня года (1-366).
toDayOfMonth
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер дня в месяце (1-31).
Синонимы: DAYOFMONTH , DAY .
toDayOfWeek
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер дня в неделе (понедельник — 1, воскресенье — 7).
toHour
Переводит дату-с-временем в число типа UInt8, содержащее номер часа в сутках (0-23). Функция исходит из допущения, что перевод стрелок вперёд, если осуществляется, то на час, в два часа ночи, а перевод стрелок назад, если осуществляется, то на час, в три часа ночи (что, в общем, не верно — даже в Москве два раза перевод стрелок был осуществлён в другое время).
toMinute
Переводит дату-с-временем в число типа UInt8, содержащее номер минуты в часе (0-59).
toSecond
Переводит дату-с-временем в число типа UInt8, содержащее номер секунды в минуте (0-59). Секунды координации не учитываются.
toUnixTimestamp
Переводит строку, дату или дату-с-временем в Unix Timestamp, имеющий тип UInt32 . Строка может сопровождаться вторым (необязательным) аргументом, указывающим часовой пояс.
Синтаксис
toUnixTimestamp(date) toUnixTimestamp(str, [timezone])
Возвращаемое значение
- Возвращает Unix Timestamp.
Пример
SELECT '2017-11-05 08:07:47' AS dt_str, toUnixTimestamp(dt_str) AS from_str, toUnixTimestamp(dt_str, 'Asia/Tokyo') AS from_str_tokyo, toUnixTimestamp(toDateTime(dt_str)) AS from_datetime, toUnixTimestamp(toDateTime64(dt_str, 0)) AS from_datetime64, toUnixTimestamp(toDate(dt_str)) AS from_date, toUnixTimestamp(toDate32(dt_str)) AS from_date32 FORMAT Vertical;
Row 1: ────── dt_str: 2017-11-05 08:07:47 from_str: 1509869267 from_str_tokyo: 1509836867 from_datetime: 1509869267 from_datetime64: 1509869267 from_date: 1509840000 from_date32: 1509840000
Тип возвращаемого значения описанными далее функциями toStartOf* , toLastDayOf* , toMonday , timeSlot определяется конфигурационным параметром enable_extended_results_for_datetime_functions имеющим по умолчанию значение 0 .
- enable_extended_results_for_datetime_functions = 0 :
- Функции toStartOfYear , toStartOfISOYear , toStartOfQuarter , toStartOfMonth , toStartOfWeek , toLastDayOfWeek , toLastDayOfMonth , toMonday возвращают Date или DateTime .
- Функции toStartOfDay , toStartOfHour , toStartOfFifteenMinutes , toStartOfTenMinutes , toStartOfFiveMinutes , toStartOfMinute , timeSlot возвращают DateTime . Хотя эти функции могут принимать значения расширенных типов Date32 и DateTime64 в качестве аргумента, при обработке аргумента вне нормального диапазона значений ( 1970 — 2148 для Date и 1970-01-01 00:00:00 — 2106-02-07 08:28:15 для DateTime ) будет получен некорректный результат.
- Функции toStartOfYear , toStartOfISOYear , toStartOfQuarter , toStartOfMonth , toStartOfWeek , toLastDayOfWeek , toLastDayOfMonth , toMonday возвращают Date или DateTime если их аргумент Date или DateTime и они возвращают Date32 или DateTime64 если их аргумент Date32 или DateTime64 .
- Функции toStartOfDay , toStartOfHour , toStartOfFifteenMinutes , toStartOfTenMinutes , toStartOfFiveMinutes , toStartOfMinute , timeSlot возвращают DateTime , если их аргумент имеет тип Date или DateTime , и DateTime64 если их аргумент имеет тип Date32 или DateTime64 .
toStartOfYear
Округляет дату или дату-с-временем вниз до первого дня года. Возвращается дата.
toStartOfISOYear
Округляет дату или дату-с-временем вниз до первого дня ISO года. Возвращается дата. Начало ISO года отличается от начала обычного года, потому что в соответствии с ISO 8601:1988 первая неделя года — это неделя с четырьмя или более днями в этом году.
1 Января 2017 г. — воскресение, т.е. первая ISO неделя 2017 года началась в понедельник 2 января, поэтому 1 января 2017 это 2016 ISO-год, который начался 2016-01-04.
SELECT toStartOfISOYear(toDate('2017-01-01')) AS ISOYear20170101;┌─ISOYear20170101─┐ │ 2016-01-04 │ └─────────────────┘toStartOfQuarter
Округляет дату или дату-с-временем вниз до первого дня квартала. Первый день квартала — это одно из 1 января, 1 апреля, 1 июля, 1 октября. Возвращается дата.
toStartOfMonth
Округляет дату или дату-с-временем вниз до первого дня месяца. Возвращается дата.
toLastDayOfMonth
Округляет дату или дату-с-временем до последнего числа месяца. Возвращается дата.
Возвращаемое значение для некорректных дат зависит от реализации. ClickHouse может вернуть нулевую дату, выбросить исключение, или выполнить «естественное» перетекание дат между месяцами.
toMonday
Округляет дату или дату-с-временем вниз до ближайшего понедельника. Возвращается дата.
toStartOfWeek(t[, mode [, timezone] ])
Округляет дату или дату-с-временем назад, до ближайшего воскресенья или понедельника, в соответствии с mode. Возвращается дата. Аргумент mode работает точно так же, как аргумент mode toWeek(). Если аргумент mode опущен, то используется режим 0.
toLastDayOfWeek(t[, mode [, timezone] ])
Округляет дату или дату-с-временем вперёд, до ближайшей субботы или воскресенья, в соответствии с mode. Возвращается дата. Аргумент mode работает точно так же, как аргумент mode toWeek(). Если аргумент mode опущен, то используется режим 0.
toStartOfDay
Округляет дату-с-временем вниз до начала дня. Возвращается дата-с-временем.
toStartOfHour
Округляет дату-с-временем вниз до начала часа.
toStartOfMinute
Округляет дату-с-временем вниз до начала минуты.
toStartOfSecond
Отсекает доли секунды.
Синтаксис
toStartOfSecond(value, [timezone])Аргументы
- value — дата и время. DateTime64.
- timezone — часовой пояс для возвращаемого значения (необязательно). Если параметр не задан, используется часовой пояс параметра value . String.
Возвращаемое значение
- Входное значение с отсеченными долями секунды.
Примеры
Пример без часового пояса:
WITH toDateTime64('2020-01-01 10:20:30.999', 3) AS dt64 SELECT toStartOfSecond(dt64);┌───toStartOfSecond(dt64)─┐ │ 2020-01-01 10:20:30.000 │ └─────────────────────────┘Пример с часовым поясом:
WITH toDateTime64('2020-01-01 10:20:30.999', 3) AS dt64 SELECT toStartOfSecond(dt64, 'Europe/Moscow');┌─toStartOfSecond(dt64, 'Europe/Moscow')─┐ │ 2020-01-01 13:20:30.000 │ └────────────────────────────────────────┘Смотрите также
- Часовая зона сервера, конфигурационный параметр timezone.
toStartOfFiveMinutes
Округляет дату-с-временем вниз до начала пятиминутного интервала.
toStartOfTenMinutes
Округляет дату-с-временем вниз до начала десятиминутного интервала.
toStartOfFifteenMinutes
Округляет дату-с-временем вниз до начала пятнадцатиминутного интервала.
toStartOfInterval(time_or_data, INTERVAL x unit [ , time_zone ] )
Обобщение остальных функций toStartOf* . Например, toStartOfInterval(t, INTERVAL 1 year) возвращает то же самое, что и toStartOfYear(t) , toStartOfInterval(t, INTERVAL 1 month) возвращает то же самое, что и toStartOfMonth(t) , toStartOfInterval(t, INTERVAL 1 day) возвращает то же самое, что и toStartOfDay(t) , toStartOfInterval(t, INTERVAL 15 minute) возвращает то же самое, что и toStartOfFifteenMinutes(t) , и т.п.
toTime
Переводит дату-с-временем на некоторую фиксированную дату, сохраняя при этом время.
toRelativeYearNum
Переводит дату или дату-с-временем в номер года, начиная с некоторого фиксированного момента в прошлом.
toRelativeQuarterNum
Переводит дату или дату-с-временем в номер квартала, начиная с некоторого фиксированного момента в прошлом.
toRelativeMonthNum
Переводит дату или дату-с-временем в номер месяца, начиная с некоторого фиксированного момента в прошлом.
toRelativeWeekNum
Переводит дату или дату-с-временем в номер недели, начиная с некоторого фиксированного момента в прошлом.
toRelativeDayNum
Переводит дату или дату-с-временем в номер дня, начиная с некоторого фиксированного момента в прошлом.
toRelativeHourNum
Переводит дату-с-временем в номер часа, начиная с некоторого фиксированного момента в прошлом.
toRelativeMinuteNum
Переводит дату-с-временем в номер минуты, начиная с некоторого фиксированного момента в прошлом.
toRelativeSecondNum
Переводит дату-с-временем в номер секунды, начиная с некоторого фиксированного момента в прошлом.
toISOYear
Переводит дату или дату-с-временем в число типа UInt16, содержащее номер ISO года. ISO год отличается от обычного года, потому что в соответствии с ISO 8601:1988 ISO год начинается необязательно первого января.
Пример
SELECT toDate('2017-01-01') AS date, toYear(date), toISOYear(date)┌───────date─┬─toYear(toDate('2017-01-01'))─┬─toISOYear(toDate('2017-01-01'))─┐ │ 2017-01-01 │ 2017 │ 2016 │ └────────────┴──────────────────────────────┴─────────────────────────────────┘toISOWeek
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер ISO недели. Начало ISO года отличается от начала обычного года, потому что в соответствии с ISO 8601:1988 первая неделя года — это неделя с четырьмя или более днями в этом году.
1 Января 2017 г. — воскресение, т.е. первая ISO неделя 2017 года началась в понедельник 2 января, поэтому 1 января 2017 это последняя неделя 2016 года.
Пример
SELECT toISOWeek(toDate('2017-01-01')) AS ISOWeek20170101, toISOWeek(toDate('2017-01-02')) AS ISOWeek20170102┌─ISOWeek20170101─┬─ISOWeek20170102─┐ │ 52 │ 1 │ └─────────────────┴─────────────────┘toWeek(date [ , mode ] [ , timezone ] )
Переводит дату или дату-с-временем в число UInt8, содержащее номер недели. Второй аргументам mode задает режим, начинается ли неделя с воскресенья или с понедельника и должно ли возвращаемое значение находиться в диапазоне от 0 до 53 или от 1 до 53. Если аргумент mode опущен, то используется режим 0.
toISOWeek() эквивалентно toWeek(date,3) .
Описание режимов (mode):
Mode Первый день недели Диапазон Неделя 1 это первая неделя … 0 Воскресенье 0-53 с воскресеньем в этом году 1 Понедельник 0-53 с 4-мя или более днями в этом году 2 Воскресенье 1-53 с воскресеньем в этом году 3 Понедельник 1-53 с 4-мя или более днями в этом году 4 Воскресенье 0-53 с 4-мя или более днями в этом году 5 Понедельник 0-53 с понедельником в этом году 6 Воскресенье 1-53 с 4-мя или более днями в этом году 7 Понедельник 1-53 с понедельником в этом году 8 Воскресенье 1-53 содержащая 1 января 9 Понедельник 1-53 содержащая 1 января Для режимов со значением «с 4 или более днями в этом году» недели нумеруются в соответствии с ISO 8601:1988:
- Если неделя, содержащая 1 января, имеет 4 или более дней в новом году, это неделя 1.
- В противном случае это последняя неделя предыдущего года, а следующая неделя — неделя 1.
Для режимов со значением «содержит 1 января», неделя 1 – это неделя содержащая 1 января. Не имеет значения, сколько дней в новом году содержала неделя, даже если она содержала только один день.
Пример
SELECT toDate('2016-12-27') AS date, toWeek(date) AS week0, toWeek(date,1) AS week1, toWeek(date,9) AS week9;┌───────date─┬─week0─┬─week1─┬─week9─┐ │ 2016-12-27 │ 52 │ 52 │ 1 │ └────────────┴───────┴───────┴───────┘toYearWeek(date [,mode] )
Возвращает год и неделю для даты. Год в результате может отличаться от года в аргументе даты для первой и последней недели года.
Аргумент mode работает так же, как аргумент mode toWeek(), значение mode по умолчанию — 0 .
toISOYear() эквивалентно intDiv(toYearWeek(date,3),100)
Однако, есть отличие в работе функций toWeek() и toYearWeek() . toWeek() возвращает номер недели в контексте заданного года, и в случае, когда toWeek() вернёт 0 , toYearWeek() вернёт значение, соответствующее последней неделе предыдущего года (см. prev_yearWeek в примере).
Пример
SELECT toDate('2016-12-27') AS date, toYearWeek(date) AS yearWeek0, toYearWeek(date,1) AS yearWeek1, toYearWeek(date,9) AS yearWeek9, toYearWeek(toDate('2022-01-01')) AS prev_yearWeek;┌───────date─┬─yearWeek0─┬─yearWeek1─┬─yearWeek9─┬─prev_yearWeek─┐ │ 2016-12-27 │ 201652 │ 201652 │ 201701 │ 202152 │ └────────────┴───────────┴───────────┴───────────┴───────────────┘age
Вычисляет компонент unit разницы между startdate и enddate . Разница вычисляется с точностью в 1 микросекунду. Например, разница между 2021-12-29 и 2022-01-01 3 дня для единицы day , 0 месяцев для единицы month , 0 лет для единицы year .
Синтаксис
age('unit', startdate, enddate, [timezone])Аргументы
- unit — единица измерения времени, в которой будет выражено возвращаемое значение функции. String. Возможные значения:
- microsecond (возможные сокращения: us , u )
- millisecond (возможные сокращения: ms )
- second (возможные сокращения: ss , s )
- minute (возможные сокращения: mi , n )
- hour (возможные сокращения: hh , h )
- day (возможные сокращения: dd , d )
- week (возможные сокращения: wk , ww )
- month (возможные сокращения: mm , m )
- quarter (возможные сокращения: qq , q )
- year (возможные сокращения: yyyy , yy )
Возвращаемое значение
Разница между enddate и startdate , выраженная в unit .
Пример
SELECT age('hour', toDateTime('2018-01-01 22:30:00'), toDateTime('2018-01-02 23:00:00'));┌─age('hour', toDateTime('2018-01-01 22:30:00'), toDateTime('2018-01-02 23:00:00'))─┐ │ 24 │ └───────────────────────────────────────────────────────────────────────────────────┘SELECT toDate('2022-01-01') AS e, toDate('2021-12-29') AS s, age('day', s, e) AS day_age, age('month', s, e) AS month__age, age('year', s, e) AS year_age;┌──────────e─┬──────────s─┬─day_age─┬─month__age─┬─year_age─┐ │ 2022-01-01 │ 2021-12-29 │ 3 │ 0 │ 0 │ └────────────┴────────────┴─────────┴────────────┴──────────┘date _ diff
Вычисляет разницу указанных границ unit пересекаемых между startdate и enddate .
Синтаксис
date_diff('unit', startdate, enddate, [timezone])Синонимы: dateDiff , DATE_DIFF .
Аргументы
- unit — единица измерения времени, в которой будет выражено возвращаемое значение функции. String. Возможные значения:
- microsecond (возможные сокращения: us , u )
- millisecond (возможные сокращения: ms )
- second (возможные сокращения: ss , s )
- minute (возможные сокращения: mi , n )
- hour (возможные сокращения: hh , h )
- day (возможные сокращения: dd , d )
- week (возможные сокращения: wk , ww )
- month (возможные сокращения: mm , m )
- quarter (возможные сокращения: qq , q )
- year (возможные сокращения: yyyy , yy )
Возвращаемое значение
Разница между enddate и startdate , выраженная в unit .
Пример
SELECT dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00'));┌─dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00'))─┐ │ 25 │ └────────────────────────────────────────────────────────────────────────────────────────┘date_trunc
Отсекает от даты и времени части, меньшие чем указанная часть.
Синтаксис
date_trunc(unit, value[, timezone])Аргументы
- unit — единица измерения времени, в которой задана отсекаемая часть. String Literal. Возможные значения:
- second
- minute
- hour
- day
- week
- month
- quarter
- year
Возвращаемое значение
- Дата и время, отсеченные до указанной части.
Примеры
Запрос без указания часового пояса:
SELECT now(), date_trunc('hour', now());┌───────────────now()─┬─date_trunc('hour', now())─┐ │ 2020-09-28 10:40:45 │ 2020-09-28 10:00:00 │ └─────────────────────┴───────────────────────────┘Запрос с указанием часового пояса:
SELECT now(), date_trunc('hour', now(), 'Europe/Moscow');┌───────────────now()─┬─date_trunc('hour', now(), 'Europe/Moscow')─┐ │ 2020-09-28 10:46:26 │ 2020-09-28 13:00:00 │ └─────────────────────┴────────────────────────────────────────────┘Смотрите также
date _ add
Добавляет интервал времени или даты к указанной дате или дате со временем.
Синтаксис
date_add(unit, value, date)Синонимы: dateAdd , DATE_ADD .
Аргументы
- unit — единица измерения времени, в которой задан интервал для добавления. String. Возможные значения:
- second
- minute
- hour
- day
- week
- month
- quarter
- year
Возвращаемое значение
Дата или дата со временем, полученная в результате добавления value , выраженного в unit , к date .
Пример
SELECT date_add(YEAR, 3, toDate('2018-01-01'));┌─plus(toDate('2018-01-01'), toIntervalYear(3))─┐ │ 2021-01-01 │ └───────────────────────────────────────────────┘date _ sub
Вычитает интервал времени или даты из указанной даты или даты со временем.
Синтаксис
date_sub(unit, value, date)Синонимы: dateSub , DATE_SUB .
Аргументы
- unit — единица измерения времени, в которой задан интервал для вычитания. String. Возможные значения:
- second
- minute
- hour
- day
- week
- month
- quarter
- year
Возвращаемое значение
Дата или дата со временем, полученная в результате вычитания value , выраженного в unit , из date .
Пример
SELECT date_sub(YEAR, 3, toDate('2018-01-01'));┌─minus(toDate('2018-01-01'), toIntervalYear(3))─┐ │ 2015-01-01 │ └────────────────────────────────────────────────┘timestamp _ add
Добавляет интервал времени к указанной дате или дате со временем.
Синтаксис
timestamp_add(date, INTERVAL value unit)Синонимы: timeStampAdd , TIMESTAMP_ADD .
Аргументы
- date — дата или дата со временем. Date или DateTime.
- value — значение интервала для добавления. Int.
- unit — единица измерения времени, в которой задан интервал для добавления. String. Возможные значения:
- second
- minute
- hour
- day
- week
- month
- quarter
- year
Возвращаемое значение
Дата или дата со временем, полученная в результате добавления value , выраженного в unit , к date .
Пример
select timestamp_add(toDate('2018-01-01'), INTERVAL 3 MONTH);┌─plus(toDate('2018-01-01'), toIntervalMonth(3))─┐ │ 2018-04-01 │ └────────────────────────────────────────────────┘timestamp _ sub
Вычитает интервал времени из указанной даты или даты со временем.
Синтакис
timestamp_sub(unit, value, date)Синонимы: timeStampSub , TIMESTAMP_SUB .
Аргументы
- unit — единица измерения времени, в которой задан интервал для вычитания. String. Возможные значения:
- second
- minute
- hour
- day
- week
- month
- quarter
- year
Возвращаемое значение
Дата или дата со временем, полученная в результате вычитания value , выраженного в unit , из date .
Пример
select timestamp_sub(MONTH, 5, toDateTime('2018-12-18 01:02:03'));┌─minus(toDateTime('2018-12-18 01:02:03'), toIntervalMonth(5))─┐ │ 2018-07-18 01:02:03 │ └──────────────────────────────────────────────────────────────┘now
Возвращает текущую дату и время.
Синтаксис
now([timezone])Параметры
- timezone — часовой пояс для возвращаемого значения (необязательно). String.
Возвращаемое значение
- Текущие дата и время.
Пример
Запрос без указания часового пояса:
SELECT now();┌───────────────now()─┐ │ 2020-10-17 07:42:09 │ └─────────────────────┘Запрос с указанием часового пояса:
SELECT now('Europe/Moscow');┌─now('Europe/Moscow')─┐ │ 2020-10-17 10:42:23 │ └──────────────────────┘nowInBlock
Возращает текующию дату и время в момент обработки блока данных. В отличие от функции now , возращаемое значение не константа, и будет возрващаться разлчиные значения в разных блоках данных при долгих запросах
Имеет смысл использовать данную функцию для получения времени сейчас при длительных запросов INSERT SELECT.
today
Возвращает текущую дату на момент выполнения запроса. Функция не требует аргументов. То же самое, что toDate(now())
yesterday
Возвращает вчерашнюю дату на момент выполнения запроса. Делает то же самое, что today() — 1. Функция не требует аргументов.
timeSlot
Округляет время до получаса. Эта функция является специфичной для Яндекс.Метрики, так как полчаса — минимальное время, для которого, если соседние по времени хиты одного посетителя на одном счётчике отстоят друг от друга строго более, чем на это время, визит может быть разбит на два визита. То есть, кортежи (номер счётчика, идентификатор посетителя, тайм-слот) могут использоваться для поиска хитов, входящий в соответствующий визит.
timeSlots(StartTime, Duration, [ , Size ] )
Для интервала, начинающегося в StartTime и длящегося Duration секунд, возвращает массив моментов времени, кратных Size . Параметр Size указывать необязательно, по умолчанию он равен 1800 секундам (30 минутам) — необязательный параметр.
Возвращает массив DateTime/DateTime64 (тип будет совпадать с типом параметра ’StartTime’). Для DateTime64 масштаб(scale) возвращаемой величины может отличаться от масштаба фргумента ’StartTime’ — результат будет иметь наибольший масштаб среди всех данных аргументов.
SELECT timeSlots(toDateTime('2012-01-01 12:20:00'), toUInt32(600)); SELECT timeSlots(toDateTime('1980-12-12 21:01:02', 'UTC'), toUInt32(600), 299); SELECT timeSlots(toDateTime64('1980-12-12 21:01:02.1234', 4, 'UTC'), toDecimal64(600.1, 1), toDecimal64(299, 0));┌─timeSlots(toDateTime('2012-01-01 12:20:00'), toUInt32(600))─┐ │ ['2012-01-01 12:00:00','2012-01-01 12:30:00'] │ └─────────────────────────────────────────────────────────────┘ ┌─timeSlots(toDateTime('1980-12-12 21:01:02', 'UTC'), toUInt32(600), 299)─┐ │ ['1980-12-12 20:56:13','1980-12-12 21:01:12','1980-12-12 21:06:11'] │ └─────────────────────────────────────────────────────────────────────────┘ ┌─timeSlots(toDateTime64('1980-12-12 21:01:02.1234', 4, 'UTC'), toDecimal64(600.1, 1), toDecimal64(299, 0))─┐ │ ['1980-12-12 20:56:13.0000','1980-12-12 21:01:12.0000','1980-12-12 21:06:11.0000'] │ └───────────────────────────────────────────────────────────────────────────────────────────────────────────┘toYYYYMM
Переводит дату или дату со временем в число типа UInt32, содержащее номер года и месяца (YYYY * 100 + MM).
toYYYYMMDD
Переводит дату или дату со временем в число типа UInt32, содержащее номер года, месяца и дня (YYYY 10000 + MM 100 + DD).
toYYYYMMDDhhmmss
Переводит дату или дату со временем в число типа UInt64 содержащее номер года, месяца, дня и время (YYYY 10000000000 + MM 100000000 + DD 1000000 + hh 10000 + mm * 100 + ss).
formatDateTime
Функция преобразует дату-и-время в строку по заданному шаблону. Важно: шаблон — константное выражение, поэтому использовать разные шаблоны в одной колонке не получится.
Синтаксис
formatDateTime(Time, Format[, Timezone])Возвращаемое значение
Возвращает значение времени и даты в определенном вами формате.
Поля подстановки
Используйте поля подстановки для того, чтобы определить шаблон для выводимой строки. В колонке «Пример» результат работы функции для времени 2018-01-02 22:33:44 .
Поле Описание Пример %C номер года, поделённый на 100 (00-99) 20 %d день месяца, с ведущим нулём (01-31) 02 %D короткая запись %m/%d/%y 01/02/18 %e день месяца, с ведущим пробелом ( 1-31) 2 %F короткая запись %Y-%m-%d 2018-01-02 %G четырехзначный формат вывода ISO-года, который основывается на особом подсчете номера недели согласно стандарту ISO 8601, обычно используется вместе с %V 2018 %g двузначный формат вывода года по стандарту ISO 8601 18 %H час в 24-часовом формате (00-23) 22 %I час в 12-часовом формате (01-12) 10 %j номер дня в году, с ведущими нулями (001-366) 002 %m месяц, с ведущим нулём (01-12) 01 %M минуты, с ведущим нулём (00-59) 33 %n символ переноса строки (‘’) %p обозначения AM или PM PM %Q квартал (1-4) 1 %R короткая запись %H:%M 22:33 %S секунды, с ведущими нулями (00-59) 44 %t символ табуляции (’) %T формат времени ISO 8601, одинаковый с %H:%M:%S 22:33:44 %u номер дня недели согласно ISO 8601, понедельник — 1, воскресенье — 7 2 %V номер недели согласно ISO 8601 (01-53) 01 %w номер дня недели, начиная с воскресенья (0-6) 2 %y год, последние 2 цифры (00-99) 18 %Y год, 4 цифры 2018 %z Смещение времени от UTC +HHMM или -HHMM -0500 %% символ % % Пример
SELECT formatDateTime(toDate('2010-01-04'), '%g');MS SQL как вычесть дату из даты?
нужно сделать так, чтобы запрос выводил время обработки всех действующих запросов.
select
[comand],
getdate() — [start_time]
from sys.dm_exec_requests
group by [comand]Дополнен 4 года назад
проблему решил, если кому будет нужно, то вот запрос:
select
command,
CAST((getdate() — start_time) AS TIME)
from sys.dm_exec_requests
—where command like ‘update’
order by start_time descЛучший ответ
чекаешь дату начала операции
чекаешь дату конца операции
переводчишь даты в секунды
вычитаешь из конца — начало
переводишь полученный результат обратно в датуДмитрий КислицынУченик (82) 4 года назад
спасибо, кэп, но логику я знаю.
Дмитрий КислицынУченик (82) 4 года назад
похоже, ты не шаришь ((
Остальные ответы
Дмитрий КислицынУченик (82) 4 года назаднемного не то.
мне нужно вычислить разницу во времени
отдельно выводить часы, минуты и секунды в числовой формат тоже не выход — будут отрицательные значения в минутах и секундах.Аглая Шниц Искусственный Интеллект (126448) там вроде написано, что первый параметр time как раз и даёт часы: минуты: секунды select [comand], datediff(time, [start_time], getdate()) from sys.dm_exec_requests group by [comand]
