Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 计算每月的总工作日_Sql Server - Fatal编程技术网

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