我需要查看一个日期跨度(天数)是否与覆盖同一时期的两个日期跨度相匹配,但是会一起添加。
例如......
DECLARE @Table1 TABLE
(
Id INT,
StartDate DATETIME,
EndDate DATETIME
)
INSERT INTO @Table1 VALUES (1, '2015-07-01 00:00:00.000', '2016-06-30 00:00:00.000')
DECLARE @Table2 TABLE
(
Id INT,
Fk INT,
StartDate DATETIME,
EndDate DATETIME
)
INSERT INTO @Table2 VALUES (1, 1, '2015-07-01', '2015-08-31')
INSERT INTO @Table2 VALUES (2, 1, '2015-09-01', '2016-03-31')
INSERT INTO @Table2 VALUES (3, 1, '2016-04-01', NULL)
SELECT DATEDIFF(DAY, T1.StartDate, T1.EndDate) AS SiteContractDays,
DATEDIFF(DAY, T2.StartDate, ISNULL(T2.EndDate, T1.EndDate)) AS SummedDayes
FROM @Table1 t1
INNER JOIN @Table2 t2
ON t2.fk = t1.Id
SELECT T1.Id, DATEDIFF(DAY, T1.StartDate, T1.EndDate) AS SiteContractDays,
SUM(DATEDIFF(DAY, T2.StartDate, ISNULL(T2.EndDate, T1.EndDate))) AS SummedDayes
FROM @Table1 t1
INNER JOIN @Table2 t2
ON t2.fk = t1.Id
GROUP BY T1.id, T1.StartDate, T1.EndDate
日期是连续的..它们会持续整个时期。然而,当我总结它们时,我们会缩短几天。我不确定我可以简单地为每个DateDiff添加一天,因为...然后总数达到366,总计值也会增加。
我可以将" + COUNT(*) -1 AS"
添加到将它们分组的日期的SUM中,但这看起来像是一个黑客。
答案 0 :(得分:0)
也许+ 1更好但如果按秒计算最终将是1460天
SELECT (DATEDIFF(SECOND, '2015-07-01 00:00:00', '2016-06-30 23:59:59') + DATEDIFF(SECOND, '2016-07-01 00:00:00', '2019-06-30 23:59:59')) / 60 / 60 / 24
-- 1460
答案 1 :(得分:0)
您需要了解两种不同的陈述。
SELECT DATEDIFF(DAY, '2015-07-01 00:00:00.000', '2019-06-30 00:00:00.000') -- 1460
没有休息,因此从第1天开始连续计数 2015-07-02第1天
SELECT DATEDIFF(DAY, '2015-07-01', '2016-06-30') + DATEDIFF(DAY, '2016-07-01', '2019-06-30 00:00:00.000') -- 1459
两个不同的开始日期,因此两个不同的第1天,所以你不会认为这是连续的......
2015-07-02第1天和2016-07-02第1天... 2016-06-30和2016-07-01之间是您的休息时间,不计算在内。
答案 2 :(得分:0)
也许在休息期间,你总是需要明确地添加1个缺失的第二个。
SELECT
DATEDIFF(DAY, '2015-07-01 00:00:00.000', '2016-06-30') +
DATEDIFF(DAY, '2016-07-01', DATEADD(SECOND,1,'2019-06-30 23:59:59.000')) --1460