【问题标题】:Roundup years obtained from datediff function从 datediff 函数获得的汇总年份
【发布时间】:2017-07-25 04:04:05
【问题描述】:

我想根据datediff 函数对年份进行四舍五入。假设我有两个日期:20/07/201511/10/1976。得到差值后,我将天除以 365 天,将其转换为年。因此,我应该得到 38.79726027 年,我四舍五入得到 39。

但是,我的 tqsl 脚本似乎没有提供预期的答案。谁能帮我查询?

SELECT [Date of Birth], [Risk_Comm Date],
       ceiling(DATEDIFF(year,[Date of Birth], [Risk_Comm Date]))
       AS [Age Limit Check]  FROM [201610$_1]

【问题讨论】:

  • DATEDIFF 返回ints。它的返回值没有什么可以向上或向下舍入的。四舍五入中是否有任何可接受的“晃动”? IE。计算月差并除以可以接受吗?否则,您必须在几天内完成,但闰年会出现问题。由于DATEDIFF 计算transitions,它总是会产生一个等于或小于你可能想要的“人类”值的数字。
  • 简而言之,如果你不想四舍五入,你应该像DATEDIFF(DAY,'19761011','20150720')/365.00一样自己计算它

标签: sql sql-server date datediff


【解决方案1】:

这样做:

ROUND(ceiling(DATEDIFF(year,[Date of Birth], [Risk_Comm Date])),0)

结果:39.0

还有,

CAST(ROUND(ceiling(DATEDIFF(year,[Date of Birth], [Risk_Comm Date])),0) as int)

结果:39

但据我所知,DATEDIFF 默认应该返回INT

【讨论】:

    【解决方案2】:

    您可以通过考虑两个竞争者并选择最接近风险日期的一个来获得“全面”的年龄。我在这里使用 CTE 来挑选竞争者,其他选项可能是 APPLY:

    declare @t table (DOB datetime not null, RiskDate datetime not null);
    insert into @t(DOB,RiskDate) values ('19761011','20150720');
    
    ;With Contenders as (
        select
            DATEDIFF(year,DOB,RiskDate) as Age1,
            DATEDIFF(year,DOB,RiskDate)+1 as Age2,
            *
        from @t
    )
    select
        CASE WHEN
            DATEDIFF(day,RiskDate,DATEADD(year,Age2,DOB)) <
            DATEDIFF(day,DATEADD(year,Age1,DOB),RiskDate)
            THEN Age2
            ELSE Age1
        END as RoundedAge
    from Contenders
    

    通过仔细考虑我在最后的DATEDIFF 调用中放置参数的顺序,我确保两个表达式都产生了积极的结果。

    如果它恰好在一个年龄和另一个年龄之间进行划分,则上述产生较低的年龄。如果您希望在这种情况下使用更高的年龄,只需将&lt; 替换为&lt;=

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多