Informix查询到星期五和星期六排除&一周的所有日子的下午4点到晚上8点

时间:2017-04-27 10:12:48

标签: sql-server informix datepart

我要求编写一个Informix查询,该查询将获取该表的所有记录,不包括所有星期的星期五和星期六以及一周中所有日期的下午4点到晚上8点之间的数据

实施例

如果我的表格中有以下记录

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)

其余数据不应该被提取,因为这些记录是星期五或星期六以及下午4点到晚上8点之间的日期时间(不仅是星期五和星期六,而且是一周的所有日子)。

我在下面有我的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

但我需要将此Query更改为Informix Query。我用Google搜索了很多方法来找到一个但没有用的方法。有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:2)

对查询使用此WHERE子句应该有效:

WHERE WEEKDAY(ProcessStartTime) NOT IN (5,6)
AND EXTEND(ProcessStartTime, HOUR TO HOUR)::char(2)::int 
    NOT BETWEEN 16 AND 20

由于没有从datetime到integer的内置强制转换操作,因此需要进行双重转换。

答案 1 :(得分:1)

这类似于Simon Riddle&#39; answer,但使用明确的时间范围表示法:

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点的事件而不是排除事件,>=可能需要>。请注意,BETWEEN ... AND运算符包括范围内的两个端点。