【问题标题】:Return Date Diff as Decimal以十进制返回日期差异
【发布时间】:2020-01-08 15:27:49
【问题描述】:

我试图以更精确的小数形式返回两个日期之间的年数。

例如:

如果差是 1 年 1 个月 15 天,我想 返回 1.15 或类似的值。最终,在这 例如,我想显示差异是 1 年 1 个月和 15 天 以十进制形式显示的差异。

我能够返回十进制值,但我不确定如何正确显示小数点后十位和百位。我确定我需要做一些数学运算才能正确显示。目前,我的代码只在小数点右侧返回零。

select 
     *,
     cast((cast(begin_date as date) - cast(end_date as date) YEAR) as decimal (3,2)) AS year_diff
from 
     x

同样,预期结果将是 1.15 的值,介于 1 年、1 个月和 15 天之间的 2 个值之间。目前我只返回 1.00。

【问题讨论】:

  • 您使用的是什么 SQL Server?另外,我可以用来测试的 2 个示例日期是什么?
  • 查看this post 上的“更新”解决方案。您应该能够将其翻译为您的查询(目前无法正常工作,因此我无法真正为您做到这一点)。但是您应该能够在查询中复制它并用您的列替换变量。
  • 你好@Stivan。我正在使用 Teradata sql。我认为使用和测试的 2 个日期是“2018-07-01”和“2019-08-16”。我希望看到返回的值类似于 1.15 或类似的值。谢谢。
  • 感谢您的回复和参考@JacobH。我会看看那个帖子,看看我是否也能从那里弄清楚。
  • 仅供参考:彻底回答问题非常耗时。如果您的问题已通过提供的解决方案得到解决,请通过选中一个为已接受或按向上箭头表示感谢。接受最适合您需求的解决方案。检查位于答案左上角的向上/向下箭头下方。 如果没有回答问题,请发表评论。 What should I do when someone answers my question?。谢谢。

标签: sql teradata


【解决方案1】:

在当前选择中,您会得到两个日期之间的天数,然后除以 365(1 年)。

无四舍五入的小数位:

select
    DATEDIFF(day, '2018-07-01', '2019-08-16')*1.0/365 as date;

查询结果:1.126027

如果您只想四舍五入到小数点后两位:

select
    Round(DATEDIFF(day, '2018-07-01', '2019-08-16')*1.0/365,2) as date

查询结果:1.13

这里是sqlfiddle

【讨论】:

    【解决方案2】:

    重新阅读您的问题后,试试这个:

    with cte (day1,day2) as(
    select  date '2018-07-01' as day1,
    date '2019-08-16' as day2)
    select 
         cte.*,
         cast((cast(day2 as date) - cast(day1 as date) YEAR) as int) AS year_diff,
         cast (months_between(day2,day1)  as int) - (year_diff * 12) as month_diff,
         add_months(day2,(-1 * year_diff * 12 ) - month_diff) - day1 as days_diff
    from 
        cte
    
    +------------+------------+-----------+------------+-----------+
    |    day1    |    day2    | year_diff | month_diff | days_diff |
    +------------+------------+-----------+------------+-----------+
    | 2018-07-01 | 2019-08-16 |         1 |          1 |        15 |
    +------------+------------+-----------+------------+-----------+
    

    虽然不完全确定我完全理解你想如何将所有这些放在一起......

    【讨论】:

      【解决方案3】:

      您当前的 Select 返回年份,不带小数部分。

      在 Teradata 中,减去两个日期会返回中间的天数,因为每四年是闰年,这会返回一个近似结果:

      cast((end_date - begin_date) / 365.25 as dec(6,2)) -- 1.13
      

      这通常比使用遵循一些奇怪的 Oracle 逻辑的 MONTH_BETWEEN 更好:-)

      cast(months_between(end_date, begin_date)/12 as dec(6,2))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-28
        • 2018-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多