我要求编写一个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搜索了很多方法来找到一个但没有用的方法。有人可以帮我这个吗?
答案 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运算符包括范围内的两个端点。