首页 > 解决方案 > 在 SQL 中计算从开始日期开始的时间

问题描述

我正在尝试统计活跃超过一年的唯一 ID 帐户的数量,以及每个帐户的活跃时间。我拥有的代码的问题是它不包括当前处于活动状态的帐户(没有结束日期的帐户)。例如,如果开始日期是 2018 年 5 月 1 日,但由于当前处于活动状态而没有结束日期,则它也应该包含在此查询中。这是我到目前为止所拥有的..

SELECT UniqueID,
DATEDIFF(yy, Begin_Date,End_Date) as timeactive
FROM TABLE
WHERE DATEDIFF(yy, Begin_Date,End_Date) > 1

我希望我的输出看起来像......

Unique ID    Time active
F000012      2.5
F000031      1.5

这就是最终的工作:

SELECT UniqueID,
    CAST(ROUND(DATEDIFF(day, Begin_Date, COALESCE(End_Date, getdate()))/365.0, 1, 0) AS NUMERIC (10,1)) as timeactive
    FROM TABLE
    WHERE DATEDIFF(day, Begin_Date, COALESCE (End_Date, getdate())) >= 365

标签: sqlsql-servertsqldatewhere-clause

解决方案


如果 EndDate 为 null,则 DateDiff 函数的输出将为 null,并且与任何内容(甚至另一个 null)相比的任何 null 都是 null 的结果(通常随后被解释为 false)

如果它为空,我建议您使用 COALESCE 将结束日期转换为今天:

SELECT 
  UniqueID,
  DATEDIFF(yy, Begin_Date,COALESCE(End_Date, GetUtcDate()) as timeactive
FROM TABLE
WHERE DATEDIFF(yy, Begin_Date,COALESCE(End_Date, GetUtcDate()) > 1

您应该记住,这里使用的 DATEDIFF 函数在 SQLserver 中不会返回两个日期之间经过的时间量。它返回命名间隔在两个日期之间更改的次数

例如,DATEDIFF(year, 2000-01-01, 2000-12-31 23:59:59)将返回 0,因为它们都是 2000 年,即使它们相隔一年仅差一秒。如果您这样做,DATEDIFF(year, 2000-12-31 23:59:59, 2001-01-01 00:00:01)即使这些日期仅相隔两秒,datediff 也会将它们报告为相隔 1 年,因为年份编号已从 2000 年更改为 2001 年。

每当时钟经过间隔更改时,DATEDIFF 就加一,在这种情况下,间隔为 Year

要让您的日期报告为 1.5 年等,您应该考虑将日期差异按较小的间隔并除以,例如询问两个日期之间的 DAYS 差异,然后除以 365.25(一年中的平均天数)。您要求 datediff 的间隔越小,结果就越准确,但它永远不会是 100%。如果您只追求一年中小数点后一位的结果,那么天数就足够准确了

要获得 1 个小数位,请转换为具有 1 个 DP 的数字:

SELECT 
  UniqueID,
  CAST(DATEDIFF(day, Begin_Date,COALESCE(End_Date, GetUtcDate())/365.25 AS NUMERIC(5,1)) as timeactive
FROM TABLE
WHERE DATEDIFF(day, Begin_Date,COALESCE(End_Date, GetUtcDate()) >= 365

推荐阅读