【问题标题】:Informix Query to EXCLUDE Friday and Saturday of the week & 4PM to 8PM all the days of the weekInformix 查询排除一周中的星期五和星期六以及一周中的所有日子的下午 4 点到晚上 8 点
【发布时间】:2017-04-27 10:12:47
【问题描述】:

我需要编写一个 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

但我需要将此查询更改为 Informix 查询。我在谷歌上搜索了很多以找到获得该方法的方法,但没有任何效果。谁能帮我解决这个问题?

【问题讨论】:

  • 应该包括还是排除 20:00:00?是“从 16:00 到 20:00 之前”吗?还是“从 16:00:00.00000 到并包括 20:00:00.00000”?还是别的什么?

标签: sql-server informix datepart


【解决方案1】:

使用这个 WHERE 子句进行查询应该可以工作:

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

双重转换是必要的,因为没有从日期时间到整数的内置转换操作。

【讨论】:

  • 从 20:00:01 到 20:59:59 的所有时间也被 EXTEND(ProcessStartTime, HOUR TO HOUR)::char(2)::int NOT BETWEEN 16 AND 20 排除在外
【解决方案2】:

这类似于Simon Riddleanswer,但使用了明确的时间范围表示法:

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
       )

我更喜欢这个,因为我认为调整它以包含/排除您想要的日期范围的确切结束更容易。我认为符号可能是您想要的; &gt;= 可能需要为&gt;,如果应该包括而不是排除恰好在晚上 8 点发生的事件。请注意,BETWEEN...AND 运算符包括范围中的两个端点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多