Запрос 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

Двойное приведение необходимо, так как не существует встроенной операции приведения от даты к целому числу.

Другие вопросы по тегам