我需要编写一个 SQL Server 查询,它将获取表的所有记录,不包括 所有星期的星期五和星期六以及一周中所有日子的下午 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 点之间的日期时间(不仅是星期五和星期六,而且是一周中的所有日子)。
我在下面有我的查询,
SELECT *
FROM [TABLE]
WHERE
DATEPART(hh,ProcessStartTime) >= 00 and DATEPART(hh,ProcessStartTime) <= 16
AND ((DATEPART(dw, ProcessStartTime) + @@DATEFIRST) % 7) NOT IN (6,0)
在此查询中,我能够获取不是周五和周六的记录,但不能忽略 16 到 20 小时之间的记录。我以这样的方式编写查询将获取 00 到 16 之间的记录。但我需要另一个条件来选择 20 到 23 小时之间。如果我这样做,我会得到 0 条记录。
这是显示 0 条记录的进一步修改的查询,
SELECT *
FROM [TABLE]
WHERE
DATEPART(hh,ProcessStartTime) >= 00 and DATEPART(hh,ProcessStartTime) <= 16
AND DATEPART(hh,ProcessStartTime) > 20 AND DATEPART(hh,ProcessStartTime) <= 23
AND ((DATEPART(dw, ProcessStartTime) + @@DATEFIRST) % 7) NOT IN (6,0)
请帮我解决这个问题。如果需要更多信息,请告诉我。
假设 DATEFIRST = 1(星期一),您可以使用 datepart(dayofweek) 来避免星期五和星期六,对于时间部分,我已经编辑了我之前的答案,因为我认为您说的是晚上 8 点,我想 08:00:01 必须是包含在最终结果中。
dbfiddle在这里
在你的第二个查询中,你想选择
ProcessStartTime
00:00 到 16:00之间和20:00 到 24:00 之间的记录,这显然是不可能的(例如 09:13 是 00:00 到 16:00 但不是在 20:00 和 24:00 之间,因此不匹配)。您应该使用OR而不是 AND。
就像是: