Sql server 每月工作日
我有这两个表,我想计算每月的总工作日。我写了这个查询,效果很好。但若[tbl_Calendar]表中并没有数据,那个么结果中就并没有任何数据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
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
的列时,有人试图编写有关时态数据的查询,这也有点让人误解。这两个表彼此没有链接。我想我无法使用外部联接。我知道这些表中没有日期列,但它们只是模拟表。我没有使用班次表和日历表中的日期或时间字段,因为我想它们会使事情变得有点复杂。但感谢您指出,我下次将尝试使用所有特定字段。是的,这就是我要找的。非常感谢。