Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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,我有这两个表,我想计算每月的总工作日。我写了这个查询,效果很好。但若[tbl_Calendar]表中并没有数据,那个么结果中就并没有任何数据 CREATE TABLE [tbl_Shift]( [OffDay1] [nvarchar](25) NOT NULL CONSTRAINT [DF_tbl_Shift_OffDay1] DEFAULT (N'Sunday'), [IsAlternateOffDay2] [bit] NULL, [OffDay2] [nvar

我有这两个表,我想计算每月的总工作日。我写了这个查询,效果很好。但若[tbl_Calendar]表中并没有数据,那个么结果中就并没有任何数据

   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')

    CREATE TABLE [tbl_Calendar](
    HolidayName Varchar(25),
    TotalHoldiays int
    )

    INSERT INTO [tbl_Calendar] VALUES ('Labour Day' , '2');
    INSERT INTO [tbl_Calendar] VALUES ('Mothers Day' , '1');
当两个表中的数据都存在时,这是一个很好的查询,但是当我从[tbl_Calendar]中删除记录时,我什么也得不到。我不知道我错在哪里。有人能帮我吗

        declare @StartDate datetime = '2018-05-01';
        declare @EndDate datetime = '2018-05-31';


    SELECT
        (DATEDIFF(dd, @StartDate, @EndDate+1)) -(DATEDIFF(wk, @StartDate, @EndDate))
        -ISNULL((CASE WHEN Shifts.IsAlternateOffday2 = 1 THEN (DATEDIFF(wk, @StartDate, @EndDate)) END), 0)
        -CASE WHEN EXISTS(SELECT * FROM tbl_Calendar) THEN SUM(CL.TotalHoldiays) END
        FROM tbl_Shift Shifts, tbl_Calendar CL
        GROUP BY Shifts.IsAlternateOffday2

使用左外部联接来获取数据,而不是内部联接

declare @StartDate datetime = '2018-05-01';
declare @EndDate datetime = '2018-05-31';


SELECT
    (DATEDIFF(dd, @StartDate, @EndDate+1)) -(DATEDIFF(wk, @StartDate, @EndDate))
    -ISNULL((CASE WHEN Shifts.IsAlternateOffday2 = 1 THEN (DATEDIFF(wk, @StartDate, @EndDate)) END), 0)
    -CASE WHEN EXISTS(SELECT * FROM tbl_Calendar) THEN SUM(CL.TotalHoldiays) END
    FROM tbl_Shift Shifts 
    left outer join 
    tbl_Calendar CL on (shifts.column_name = CL.column_name)
    GROUP BY Shifts.IsAlternateOffday2

杜尼,我不知道该从何说起这句话。您的临时表不合适,您正在处理没有日期列的日期,您正在进行交叉连接,由一个没有任何意义的列进行分组,因此计算非常复杂

这是您想要的修复,但是您确实需要处理您的表

declare @StartDate datetime = '2018-05-01';
declare @EndDate datetime = '2018-05-31';

SELECT
    (DATEDIFF(dd, @StartDate, @EndDate+1)) -(DATEDIFF(wk, @StartDate, @EndDate))
    -ISNULL((CASE WHEN Shifts.IsAlternateOffday2 = 1 THEN (DATEDIFF(wk, @StartDate, @EndDate)) END), 0)
    -(SELECT ISNULL(SUM(CL.TotalHoldiays), 0) FROM [#tbl_Calendar] AS CL)
FROM 
    [#tbl_Shift] Shifts
GROUP BY 
    Shifts.IsAlternateOffday2
坏表的一个例子是,您的假日没有标记日期,因此当使用诸如
@StartDate
@EndDate
之类的参数时,您实际上不知道假日何时适用


创建一个完整的日历表,每行有一天,并有足够的列指示哪一天是工作日或不是工作日、假日或现在、工作日(包括周六)等。这将真正帮助您进行日期计算。

请使用ansi样式的联接,而不是这种古老的联接类型。您在这里创建了一个内部联接,而您需要一个左外部联接。如果您要有一个“日历”表,最好有一个完整的日历表。在可预见的未来,包括每年的每一天,并且可以包括列(s),如您现在所拥有的,以确定哪一天是假日。20年的价值仍然不到10000行。当两个表都不包含任何使用
date
datetime
datetime2
的列时,有人试图编写有关时态数据的查询,这也有点让人误解。这两个表彼此没有链接。我想我无法使用外部联接。我知道这些表中没有日期列,但它们只是模拟表。我没有使用班次表和日历表中的日期或时间字段,因为我想它们会使事情变得有点复杂。但感谢您指出,我下次将尝试使用所有特定字段。是的,这就是我要找的。非常感谢。