SQL - 如何使用 'datediff' 从日期范围中排除周末
SQL - How to exclude weekends from date range using 'datediff'
我在获得想要的结果时遇到了一些问题,以下是我的逻辑陈述。
-- 逻辑:计算上个月(2 月)完成的每个 GRM 续订从 xx 到 yy 之间的天数,然后取平均值(不包括节假日和周末)。
我的查询如下,平日里我一直在研究计数。它有效,但我无法按照我想要的方式应用它。
我正在寻找的结果是识别上个月到当前月份(本例为 2 月),并从 XX 到 YY 范围内使用 (datediff) 计算天数,但只计算工作日。
--查询1计算平均周期时间(范围内的天数)
select AVG(1.00 * DATEDIFF(DAY, xx, yy)) AS Avg_DayDiff
FROM Database1.dbo.table1
where month(datecompleted) = month(dateadd(month,-1,current_timestamp))
and year(datecompleted) = year(dateadd(month,-1,current_timestamp))
and ApprovalRequiredFrom = 'GRM'
join(
--Table 查询 return 上个月的天数,包括日期名称。
select CALENDAR_DATE,
DAY_NAME,
YEAR(CALENDAR_DATE) AS cal_year,
MONTH(CALENDAR_DATE) AS cal_month
from Database1.dbo.table2
where month(CALENDAR_DATE) = month(dateadd(month,-1,current_timestamp))
and year(CALENDAR_DATE) = year(dateadd(month,-1,current_timestamp))
有什么建议吗?
谢谢!!
您可能真正想要做的是生成一个日历 table,这使得各种自定义日期操作变得几乎微不足道。幸运的是,这种情况一直出现,我们在 SO 上的一些朋友非常友好地在这里为我们收集了大量 pre-rolled 脚本:How to create a Calendar table for 100 years in Sql
一个可能的解决方案是使用 CTE 填充日期范围,然后 select DATEPART(dw, [thedate])
不在 1 或 7 中的日期(分别为星期日和星期六)。
例如,如果您只想要一个没有周末的日期列表:
DECLARE @startdate date = --Startdate that you specify. In this case I'll select the first day of the previous month
(SELECT DATEADD(MONTH, -1, CAST(DATEADD(DAY, -DAY(GETDATE()) + 1, GETDATE()) as date)))
, @enddate date = --Enddate that you specify. In this case I'll select the last day of the previous month
(SELECT DATEADD(DAY, -1, CAST(DATEADD(DAY, -DAY(GETDATE()) + 1, GETDATE()) as date)))
DECLARE @temp TABLE(thedate date)
;
WITH dates_CTE (thedate) as
(
SELECT @startdate
UNION ALL
SELECT DATEADD(day, 1, thedate)
FROM dates_CTE
WHERE thedate < @enddate
)
INSERT INTO @temp
SELECT thedate
FROM dates_CTE
WHERE DATEPART(dw, [thedate]) NOT IN (1,7) --not a weekend
--continue the main query here
SELECT * FROM @temp
在您的 GRM 查询中,对于给定的 GRM,您可以子查询 @temp 中日期大于 'xx' 且小于 'yy' 的行数。
这里需要注意的是,这没有考虑假期。每个组织的计算方式各不相同。纯 SQL 并非不可能,但日历 table 是最简单的 IMO。
我在获得想要的结果时遇到了一些问题,以下是我的逻辑陈述。
-- 逻辑:计算上个月(2 月)完成的每个 GRM 续订从 xx 到 yy 之间的天数,然后取平均值(不包括节假日和周末)。
我的查询如下,平日里我一直在研究计数。它有效,但我无法按照我想要的方式应用它。
我正在寻找的结果是识别上个月到当前月份(本例为 2 月),并从 XX 到 YY 范围内使用 (datediff) 计算天数,但只计算工作日。
--查询1计算平均周期时间(范围内的天数)
select AVG(1.00 * DATEDIFF(DAY, xx, yy)) AS Avg_DayDiff
FROM Database1.dbo.table1
where month(datecompleted) = month(dateadd(month,-1,current_timestamp))
and year(datecompleted) = year(dateadd(month,-1,current_timestamp))
and ApprovalRequiredFrom = 'GRM'
join(
--Table 查询 return 上个月的天数,包括日期名称。
select CALENDAR_DATE,
DAY_NAME,
YEAR(CALENDAR_DATE) AS cal_year,
MONTH(CALENDAR_DATE) AS cal_month
from Database1.dbo.table2
where month(CALENDAR_DATE) = month(dateadd(month,-1,current_timestamp))
and year(CALENDAR_DATE) = year(dateadd(month,-1,current_timestamp))
有什么建议吗?
谢谢!!
您可能真正想要做的是生成一个日历 table,这使得各种自定义日期操作变得几乎微不足道。幸运的是,这种情况一直出现,我们在 SO 上的一些朋友非常友好地在这里为我们收集了大量 pre-rolled 脚本:How to create a Calendar table for 100 years in Sql
一个可能的解决方案是使用 CTE 填充日期范围,然后 select DATEPART(dw, [thedate])
不在 1 或 7 中的日期(分别为星期日和星期六)。
例如,如果您只想要一个没有周末的日期列表:
DECLARE @startdate date = --Startdate that you specify. In this case I'll select the first day of the previous month
(SELECT DATEADD(MONTH, -1, CAST(DATEADD(DAY, -DAY(GETDATE()) + 1, GETDATE()) as date)))
, @enddate date = --Enddate that you specify. In this case I'll select the last day of the previous month
(SELECT DATEADD(DAY, -1, CAST(DATEADD(DAY, -DAY(GETDATE()) + 1, GETDATE()) as date)))
DECLARE @temp TABLE(thedate date)
;
WITH dates_CTE (thedate) as
(
SELECT @startdate
UNION ALL
SELECT DATEADD(day, 1, thedate)
FROM dates_CTE
WHERE thedate < @enddate
)
INSERT INTO @temp
SELECT thedate
FROM dates_CTE
WHERE DATEPART(dw, [thedate]) NOT IN (1,7) --not a weekend
--continue the main query here
SELECT * FROM @temp
在您的 GRM 查询中,对于给定的 GRM,您可以子查询 @temp 中日期大于 'xx' 且小于 'yy' 的行数。
这里需要注意的是,这没有考虑假期。每个组织的计算方式各不相同。纯 SQL 并非不可能,但日历 table 是最简单的 IMO。