我有这两个表,我想计算一个月的总工作日。我写了这个查询工作正常。但是如果[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
答案 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