我有这个表,我在一周指定假期。我想使用这些字段计算2个特定日期之间的总工作日。
CREATE TABLE [tbl_Shift](
[OffDay1] [nvarchar](25) NOT NULL CONSTRAINT [DF_tbl_Shift_OffDay1] DEFAULT (N'Sunday'),
[IsAlternateOffDay2] [bit] NULL,
[OffDay2] [nvarchar](25) NULL
)
INSERT INTO [tbl_Shift] VALUES ('Sunday', 'True', 'Saturday')
我写了这个查询,但我无法得到正确的日子。它应该给出23天,因为每周有2个假期,总共31天,但我得到26天。
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2018/05/01'
SET @EndDate = '2018/05/31'
SELECT
(DATEDIFF(dd, @StartDate, @EndDate+1)) -(DATEDIFF(wk, @StartDate, @EndDate))
-(CASE WHEN IsAlternateOffday2 = 1 THEN 1 END) FROM HRM.tbl_Shift
答案 0 :(得分:1)
每个周末减去2天。如果星期日是一周的第一天或最后一天,请检查您的服务器配置。这可以在周末之前解决问题。
SELECT DATEPART(WEEKDAY,'20180506') --Checks if Sunday is Day 1 or Day 7
DECLARE @start DATETIME = '20180501'
DECLARE @end DATETIME = '20180531'
SELECT DATEDIFF(DAY,@start,@end+1) - (DATEDIFF(WEEK,@start,@end+1)*2)
更新:
使用COALESCE将NULLS替换为替代值。
DECLARE @offdate DATETIME = NULL
SELECT COALESCE(@offdate,GETDATE())
答案 1 :(得分:1)
这将给出23:
SELECT
(DATEDIFF(dd, @StartDate, @EndDate+1)) -(DATEDIFF(wk, @StartDate, @EndDate))
-ISNULL((CASE WHEN IsAlternateOffday2 = 1 THEN (DATEDIFF(wk, @StartDate, @EndDate)) END), 0)
FROM HRM.tbl_Shift
答案 2 :(得分:0)
试试这个
DECLARE @StartDate DATE ='2018-05-01',
@EndDate DATE ='2018-05-31'
;WITH CTE
AS
(
SELECT DATEADD(DD,Number-1,@StartDate) MOnthDates,
DATENAME(DW,DATEADD(DD,Number-1,@StartDate)) As DayNAmes,
CASE WHEN DATENAME(DW,DATEADD(DD,Number-1,@StartDate)) IN ('Saturday','Sunday') THEN 0 ELSE 1 END WeekDays
FROM master.dbo.spt_values
WHERE [Type]='P'
AND Number Between 1 AND 10000
)
SELECT COUNT(WeekDays) AS WeekDaysCount
FROM CTE
WHERE WeekDays<>0
AND MOnthDates Between @StartDate AND DATEADD(DAY,1,@EndDate)
结果
WeekDaysCount
-------------
23