【问题标题】:Convert decimal year to date将十进制年份转换为日期
【发布时间】:2018-05-10 07:36:21
【问题描述】:

我的表格中有日期为stored as decimal years。一个例子是2003.024658,它转换为January 9, 2003我想将十进制年份转换为 Oracle 的日期格式。


我发现有人在 Excel 中完成了这项工作:Decimal year to date formula?

 =DATE(INT(B1),1,MOD(B1,1)*(DATE(INT(B1)+1,1,1)-DATE(INT(B1),1,1)))

但是,我不太清楚如何将逻辑转换为 Oracle PL/SQL。

【问题讨论】:

  • 你能解释一下2003.024658转换成January 9, 2003背后的逻辑吗?
  • SELECT TO_DATE ('31-DEC-2002') + (0.024658 * 365) FROM DUAL 给出输出09-Jan-2003
  • 不需要。如果它对你有帮助,那就足够了。
  • 请“接受”这个答案,以便其他想要答案的人知道有一个答案,或者那些寻求提供答案的人不会失望。
  • 如果您希望答案准确,这将取决于最初记录值的人最初是如何计算小数部分 (0.024658) - 例如在一个简单的 365 天/年,或者像 365.24 这样的平均估计值,或者可能是其他一些方案。

标签: sql oracle date date-format oracle12c


【解决方案1】:

如果您假设小数部分是根据给定年份的天数(即 365 或 366 取决于它是否是闰年)计算的,您可以这样做像这样:

with
 q1 as (select 2003.024658 d from dual)
,q2 as (select d
              ,mod(d,1) as decimal_portion
              ,to_date(to_char(d,'0000')||'0101','YYYYMMDD')
               as jan01
        from q1)
,q3 as (select q2.*
              ,add_months(jan01,12)-jan01 as days_in_year
        from q2)
select d
      ,decimal_portion * days_in_year as days
      ,jan01 + (decimal_portion * days_in_year) as result
from   q3;

d: 2003.024658
days: 9.00017
result: 10-JAN-2003 12:00am

【讨论】:

    猜你喜欢
    • 2019-07-20
    • 2021-11-15
    • 1970-01-01
    • 2021-12-26
    • 2015-11-10
    • 2023-03-13
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多