Informix 查询以排除一周中的周五和周六以及一周中所有日子的下午 4 点至晚上 8 点
Informix Query to EXCLUDE Friday and Saturday of the week & 4PM to 8PM all the days of the week
我需要编写一个 Informix 查询,它将获取 table 的所有记录,不包括所有星期的星期五和星期六以及一周中所有日子的下午 4 点到晚上 8 点之间的数据
例如:
如果我的table
中有以下记录
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 服务器查询,它在 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 查询。我在谷歌上搜索了很多以找到获得该方法的方法,但没有任何效果。谁能帮我解决这个问题?
对查询使用此 WHERE 子句应该有效:
WHERE WEEKDAY(ProcessStartTime) NOT IN (5,6)
AND EXTEND(ProcessStartTime, HOUR TO HOUR)::char(2)::int
NOT BETWEEN 16 AND 20
需要双重转换,因为没有从日期时间到整数的内置转换操作。
这类似于Simon Riddle's ,但使用明确的时间范围表示法:
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
)
我更喜欢这个,因为我认为将它调整到 include/exclude 您想要的日期范围的确切结束更容易。我认为这个符号可能是你想要的;如果应该包括而不是排除恰好在晚上 8 点发生的事件,则 >=
可能需要 >
。请注意,BETWEEN…AND 运算符包括范围内的两个端点。
我需要编写一个 Informix 查询,它将获取 table 的所有记录,不包括所有星期的星期五和星期六以及一周中所有日子的下午 4 点到晚上 8 点之间的数据
例如:
如果我的table
中有以下记录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 服务器查询,它在 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 查询。我在谷歌上搜索了很多以找到获得该方法的方法,但没有任何效果。谁能帮我解决这个问题?
对查询使用此 WHERE 子句应该有效:
WHERE WEEKDAY(ProcessStartTime) NOT IN (5,6)
AND EXTEND(ProcessStartTime, HOUR TO HOUR)::char(2)::int
NOT BETWEEN 16 AND 20
需要双重转换,因为没有从日期时间到整数的内置转换操作。
这类似于Simon Riddle's
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
)
我更喜欢这个,因为我认为将它调整到 include/exclude 您想要的日期范围的确切结束更容易。我认为这个符号可能是你想要的;如果应该包括而不是排除恰好在晚上 8 点发生的事件,则 >=
可能需要 >
。请注意,BETWEEN…AND 运算符包括范围内的两个端点。