Sql server 计算每月的总工作日
我在这张桌子上指定了一周的假期。我想使用这些字段计算两个特定日期之间的总工作日Sql server 计算每月的总工作日,sql-server,Sql Server,我在这张桌子上指定了一周的假期。我想使用这些字段计算两个特定日期之间的总工作日 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] VALU
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
每个周末减去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)
更新:
使用合并将空值替换为替代值
DECLARE @offdate DATETIME = NULL
SELECT COALESCE(@offdate,GETDATE())
这将产生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
试试这个
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)
演示:“此查询”?我看不出你的问题有任何疑问。:)哇,对不起,我的错。让我来编辑。谢谢你指出。@Larnu请现在检查。希望这有帮助。但是如果OffDay2为NULL呢?我已经将IsAlternateOffday2的值更新为NULL,现在我得到的总计数为NULL。NULL应该被视为False,对吗。?输出应该是27或26。如果周六是休息日,输出应该是27和23。我已经做了更新,这对我来说很有效。这计算不正确。请尝试从'2018-03-30'到'2018-06-15'@t-clausen.dk谢谢您的更正,我刚刚更新了代码
WeekDaysCount
-------------
23