DateDiff和连续期间

时间:2017-07-10 01:44:30

标签: sql sql-server date

我需要查看一个日期跨度(天数)是否与覆盖同一时期的两个日期跨度相匹配,但是会一起添加。

例如......

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中,但这看起来像是一个黑客。

3 个答案:

答案 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