DateDiff 和 Continuous 期间

Posted

技术标签:

【中文标题】DateDiff 和 Continuous 期间【英文标题】:DateDiff and Continuous periods 【发布时间】:2017-07-10 01:44:29 【问题描述】:

我需要查看一个日期跨度(以天数计)是否与涵盖同一时期但相加的两个日期跨度相匹配。

例如...

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" 添加到将它们分组时的总和中,但这似乎是一种技巧。

【问题讨论】:

编辑您的问题并提供示例数据和所需的结果。 1459 是正确的,因为您从 2016-07-01 开始再次计数,从 02 开始作为第 1 天 所以 2016-07-01 不包括在计数中?但它是从 2016-07-02 开始的? 不.. 你的第 1 天将从 02 开始 是的,您只需要添加一天,因为 DATEDIFF 是衡量两个日期之间单位(无论是一天、一分钟、一小时还是其他)的差异。因此,例如,今天日期和明天日期之间的日期差为 1,因为日期的数字单位将是 X+1 - X。 【参考方案1】:

也许 + 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

【讨论】:

【参考方案2】:

你需要理解的两种不同的陈述。

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 年 7 月 2 日的第 1 天和 2016 年 7 月 2 日的第 1 天...2016 年 6 月 30 日和 2016 年 7 月 1 日之间的那一天是您的休息日,不计算在内。

【讨论】:

【参考方案3】:

也许在中断期间,您总是需要明确添加缺少的 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

【讨论】:

以上是关于DateDiff 和 Continuous 期间的主要内容,如果未能解决你的问题,请参考以下文章

FATAL_ERROR:“continuous.c”,第 246 行:无法打开音频设备

如何处理 DATEDIFF(MINUTE, '00:00', '24:20') 类似的场景?

mysql max() datediff() group by

Error: Discrete value supplied to continuous scale

Docker-Compose +Jenkins +Github(续集成Continuous Integration(CI)和持续交付Continuous Delivery(CD))

R语言问题解决:Error: Discrete value supplied to continuous scale