【问题标题】:SQL Query Between two dates and two times for only weekdays仅工作日的两个日期和两个时间之间的 SQL 查询
【发布时间】:2020-05-21 21:33:38
【问题描述】:

我正在尝试编写一个查询,该查询将为我提供两个特定时间在两个特定日期之间完成的程序数量,但仅限于工作日。我的脚本适用于日期和时间,但我不知道如何获取它,以便它只包括工作日。我只想要周一到周五的结果,不包括周六和周日的结果。

我的查询:

SELECT MONTH(r.LastModifiedDate) AS MONTHpreCOVID, PlacerFld2 AS MODALITY, COUNT(*) AS CountOfReportsDayTimePreCOVID
FROM [order] o

LEFT JOIN report r
ON o.reportID = r.reportID

WHERE r.LastModifiedDate >= '2019-07-01' AND r.lastmodifieddate <= '2020-06-01'
AND CAST(r.lastmodifieddate as TIME) >= '08:00:00' AND CAST(r.lastmodifieddate as TIME) <='16:59:59'
AND reportstatusID = '7'
AND r.creatorAcctID = '139'

GROUP BY MONTH(r.LastModifiedDate), PlacerFld2
ORDER BY MONTH(r.LastModifiedDate) ASC

我尝试添加类似 WEEKDAY(r.lastmodifieddate) IN ('0','1','2','3','4') 的内容,但这不起作用。

【问题讨论】:

  • 请提供样本数据和期望的结果。 db/sql fiddle 也会有所帮助。
  • 我会努力解决这个问题,但我不知道我能更清楚地表明使用 2019-07-01 和 2020-06-01 之间的日期以及 08:00 之间的时间: 00 和 16:59:59 我想从结果中排除周六和周日。
  • DATEPART(WEEKDAY, r.lastmodifieddate) NOT IN (1,7)?

标签: sql datetime sql-server-2016


【解决方案1】:

使用这个:

AND (((DATEPART(DW, r.lastmodifieddate) - 1 ) + @@DATEFIRST ) % 7) in ('1','2','3','4','5')

(((DATEPART(DW, r.lastmodifieddate) - 1 ) + @@DATEFIRST ) % 7) 将始终返回一个介于 0 和 6 之间的数字,其中每个数字都是:

0 -> Sunday
1 -> Monday
2 -> Tuesday
3 -> Wednesday
4 -> Thursday
5 -> Friday
6 -> Saturday

你可以用这样一个简单的查询来检查它

SELECT (((DATEPART(DW, @DATE_VAR) - 1 ) + @@DATEFIRST ) % 7)

@DATE_VAR 替换为有效日期。例如1900-01-01

【讨论】:

  • 这正是我想要的。感谢您的帮助。
【解决方案2】:

您可以将星期几确定为 DATEPART(WEEKDAY, dt)。

给你看

    Select Dt, DATEPART(WEEKDAY, dt) as WeekDayNumber, DATEName(WEEKDAY, dt) as WeekDayName
 from
(
Select Getdate() as Dt Union
Select Getdate() + 1 Union
Select Getdate() + 2 Union
Select Getdate() + 3 Union
Select Getdate() + 4 Union
Select Getdate() + 5 Union
Select Getdate() + 6 Union
Select Getdate() + 7 
) Q
Where DATEPART(WEEKDAY, dt) Not In ( 1,7)

所以在你的情况下,它应该是

....
WHERE r.LastModifiedDate >= '2019-07-01' AND r.lastmodifieddate <= '2020-06-01'
AND CAST(r.lastmodifieddate as TIME) >= '08:00:00' AND CAST(r.lastmodifieddate as TIME) <='16:59:59'
AND reportstatusID = '7'
AND r.creatorAcctID = '139'
AND DATEPART(WEEKDAY, r.LastModifiedDate) Not In ( 1,7)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多