一个月的工作日

时间:2018-05-25 07:23:14

标签: 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] [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

2 个答案:

答案 0 :(得分:1)

Doonie,我不知道从哪里开始这个陈述。您的临时表格不合适,您正在处理没有日期列的日期,您正在进行交叉连接,按照没有任何意义的列进行分组,并使计算变得非常复杂。

这是您想要的解决方案,但您确实需要处理表格

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等参数时,您真的不知道何时度假适用与否。

创建一个完整的日历表,每行一天,足够的列表明哪一天是工作日,假日或现在,工作日,包括星期六等。这将真正帮助您进行日期计算。

答案 1 :(得分:0)

使用左外连接在内连接上获取数据

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