Запрос Informix на ИСКЛЮЧЕНИЕ пятницы и субботы недели и с 16:00 до 20:00 по всем дням недели
У меня есть требование написать Informix Query, который будет извлекать все записи таблицы, кроме пятницы и субботы всех недель, и данные с 16:00 до 20:00 всех дней недели.
Пример:
Если у меня есть следующие записи в моей таблице
Name ProcessStartTime Status
Name1 2017-04-01 17:00:02.000 SUCCESS(Saturday)
Name2 2017-04-02 21:00:02.000 SUCCESS(Sunday)
Name3 2017-04-03 01:00:02.000 SUCCESS(Monday)
Name4 2017-04-04 05:00:02.000 SUCCESS(Tuesday)
Name5 2017-04-05 18:00:02.000 SUCCESS(Wednesday)
Name6 2017-04-05 15:00:02.000 SUCCESS(Wednesday)
Name7 2017-04-06 23:00:02.000 SUCCESS(Thursday)
Name8 2017-04-07 15:00:02.000 SUCCESS(Friday)
Если я выполню запрос, я должен получить только следующие записи:
Name2 2017-04-02 21:00:02.000 SUCCESS(Sunday)
Name3 2017-04-03 01:00:02.000 SUCCESS(Monday)
Name4 2017-04-04 05:00:02.000 SUCCESS(Tuesday)
Name6 2017-04-05 15:00:02.000 SUCCESS(Wednesday)
Name6 2017-04-06 23:00:02.000 SUCCESS(Thursday)
И остальные данные не должны извлекаться, потому что эти записи являются либо пятницей, либо субботой, а также датой между 16:00 и 20:00 (не только по пятницам и субботам, но по всем дням недели).
У меня есть запрос SQL Server здесь, который работает нормально в SSMS,
SET DATEFIRST 1
SELECT Name, ProcessStartTime, Status
FROM @events
WHERE datepart(DW, ProcessStartTime) NOT IN (5,6)
AND (datepart(hh, ProcessStartTime) < 16
OR
ProcessStartTime > DATEADD(dd, DATEDIFF(dd, 0, ProcessStartTime), '08:00:00'))
GO
но мне нужно изменить этот запрос в Informix Query. Я много гуглил, чтобы найти способ получить тот, но ничего не получалось. Может ли кто-нибудь помочь мне в этом?
2 ответа
Это похоже на ответ Simon Riddle, но использует явную запись временного диапазона:
SELECT Name, ProcessStartTime, Status
FROM Events
WHERE WEEKDAY(ProcessStartTime) NOT IN (5, 6)
AND (EXTEND(ProcessStartTime, HOUR TO SECOND) < DATETIME(16:00:00) HOUR TO SECOND
OR EXTEND(ProcessStartTime, HOUR TO SECOND) >= DATETIME(20:00:00) HOUR TO SECOND
)
Я предпочитаю это, потому что я думаю, что легче настроить это, чтобы включить / исключить точные концы диапазонов дат, которые вы хотите. Я думаю, что запись, вероятно, то, что вы хотите; >=
может потребоваться >
если события ровно в 8 часов вечера должны быть включены, а не исключены. Обратите внимание, что операторы МЕЖДУ… И включают обе конечные точки в диапазоне.
Использование этого предложения WHERE для запроса должно работать:
WHERE WEEKDAY(ProcessStartTime) NOT IN (5,6)
AND EXTEND(ProcessStartTime, HOUR TO HOUR)::char(2)::int
NOT BETWEEN 16 AND 20
Двойное приведение необходимо, так как не существует встроенной операции приведения от даты к целому числу.