Sql 将十进制年份转换为日期

Sql 将十进制年份转换为日期,sql,oracle,date,date-format,oracle12c,Sql,Oracle,Date,Date Format,Oracle12c,我在一张桌子上有一些日期。一个例子是2003.024658,翻译为2003年1月9日。 我想将十进制年份转换为Oracle的日期格式。 我发现有人在Excel中这样做: 但是,我不太明白如何将逻辑转换为Oracle PL/SQL。如果您假设小数部分是根据给定年份的天数计算的(即365天或366天,取决于闰年),您可以执行以下操作: with q1 as (select 2003.024658 d from dual) ,q2 as (select d ,mod(d

我在一张桌子上有一些日期。一个例子是
2003.024658
,翻译为
2003年1月9日
我想将十进制年份转换为Oracle的日期格式。


我发现有人在Excel中这样做:


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

如果您假设小数部分是根据给定年份的天数计算的(即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

你能解释一下将
2003.024658
转换为
2003年1月9日
的逻辑吗?
从DUAL中选择to_DATE('2002年12月31日')+(0.024658*365)给出的输出
2003年1月9日
。不需要。如果这对你有帮助,那就足够了。请“接受”这个答案,这样其他想要答案的人就知道答案的存在,或者那些想要提供答案的人就不会失望。如果你想让答案准确,那就取决于小数部分的准确程度(
0.024658
)最初是由记录值的人计算的-例如,在一个简单的365天/年,或一些平均估计值,如365.24,或其他方案。
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