У меня есть таблица, содержащая такие столбцы Date
и PumpStatus
:
Date PumpStatus
---------------------------
1/1/24 0:15 Running
1/1/24 1:25 Stop
1/1/24 2:21 Running
1/2/24 12:15 Stop
1/2/24 14:15 Running
Как написать запрос выбора для расчета общего состояния работы и общего состояния остановки насоса в минутах, используя приведенные выше данные в заданном диапазоне дат?
Я искал, но не нашел никакой помощи как таковой. большинство сообщений связаны с функцией datediff
, которую я не понимаю, как использовать в этом сценарии.
Чтобы рассчитать время работы насоса в каждом состоянии (Работа, остановка) в минутах, вы можете использовать приведенный ниже запрос.
SELECT *
, DATEDIFF(minute, Date, LEAD(Date) OVER (ORDER BY Date)) AS Time
FROM {table}
Этот запрос будет подсчитывать разницу между двумя последовательными статусами, что даст вам такой результат:
01-01-24 00:15:00 |Running |70
01-01-24 01:25:00 |Stop |56
01-01-24 02:21:00 |Running |45234
01-02-24 12:15:00 |Stop |120
01-02-24 14:15:00 |Running |null
Теперь вы можете найти время для каждого статуса. Время вывода в минутах, как вы хотите.
DATEDIFF
— функция SQL Server для поиска разницы во времени.
Параметры для DATEDIFF
:
DATEDIFF(interval, time1, time2)
Для интервала вам необходимо передать желаемый тип вывода, в данном случае это minute
.
Функция LEAD()
используется для получения значения из строки, следующей за текущей.
Поэтому мы использовали функцию LEAD()
, чтобы получить значение даты следующей строки.
Это отлично сработало, заменив функцию DATEDIFF() :)
Да, вы правы. Функция SQL-сервера DATEDIFF. TIMESTAMPDIFF работает в MYSQL, но не является функцией сервера sql.
В качестве решения:
CREATE TABLE "a table containing columns"
(Date DATETIME2(0),
PumpStatus VARCHAR(16)
);
INSERT INTO "a table containing columns" VALUES
('1/1/24 0:15', 'Running'),
('1/1/24 1:25', 'Stop'),
('1/1/24 2:21', 'Running'),
('1/2/24 12:15', 'Stop'),
('1/2/24 14:15', 'Running');
SELECT *, DATEDIFF(minute, "Date", COALESCE(LAG("Date") OVER (ORDER BY "Date" DESC), CURRENT_TIMESTAMP)) AS Duration_MN
FROM "a table containing columns"
ORDER BY "Date" DESC;
Вам понадобится оконная функция (например, lag), чтобы получить значение предыдущих строк, а затем dateiff, чтобы получить минуты.