sql - 在 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
解决方案
如果 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
推荐阅读
- c++ - 创建或更新 DirectX11 纹理会导致访问冲突异常
- r - 从某个短语开始到某个短语
- powershell - Powershell脚本从.exe编译文件以管理员身份运行
- ruby-on-rails - 在日志中几乎没有信息的情况下获得 500 (heroku)
- javascript - ReactJS:尝试发布 POST
- python - Pandas 在双列索引上转置
- python - 如何运行当我的程序结束 python 时不退出的 bash 文件
- amazon-web-services - AWS 配置历史
- html - 使用 flex 属性时,图像不随其父 div 缩放
- python - 如何在具有 Redis 排队作业的 Flask 应用程序中使用 PostgreSQL 和 SQLAlchemy