Oracle - 如何转换由 NUMBER(6,0) 格式表示的日期

Oracle - How to convert Date represented by NUMBER(6,0) format

我从我们的第三方合作伙伴那里获得了数据,并且每个日期列都以这种 NUMBER(6,0) 格式编码:

118346
118347
118348
118351
119013
119035
119049
119051
118339
118353
119019
119028
119029
119031

None后3位大于365,所以我估计118339一定是2018+339天,也就是2018年12月5日:'2018-12-05'。我以前从未遇到过这种格式,所以我有点无奈如何处理它。这是某种标准化格式吗?我可以使用一些内置的转换函数还是应该使用一些算法手动剪切和转换它?

我想按周对行进行分组排序,所以也许我什至不应该转换它,但出于某种原因,我觉得转换为日期类型会更优雅。哪种方法更好?

编辑:我刚刚检查了我的 excel 版本的数据,这种格式实际上和我想象的一样有效。那么问题来了。

这好像是Excel's 1900-based internal representation of dates。假设您的解释是正确的,您可以通过一些操作转换为正常日期:

-- CTE for sample values
with your_table (num) as (
  select *
  from table(sys.odcinumberlist(118339, 118346, 118347, 118348, 118351, 119013, 119035,
    119049, 119051, 118339, 118353, 119019, 119028, 119029, 119031))
)
-- actual query
select num,
  date '1899-12-31'
    + floor(num/1000) * interval '1' year
    + mod(num, 1000) * interval '1' day  as converted
from your_table;

       NUM CONVERTED 
---------- ----------
    118339 2018-12-05
    118346 2018-12-12
    118347 2018-12-13
    118348 2018-12-14
    118351 2018-12-17
    119013 2019-01-13
    119035 2019-02-04
    119049 2019-02-18
    119051 2019-02-20
    118339 2018-12-05
    118353 2018-12-19
    119019 2019-01-19
    119028 2019-01-28
    119029 2019-01-29
    119031 2019-01-31

这将前三位数字 - 通过 floor(num/1000) 获得 - 作为年数,从 1900 年开始偏移。将它们乘以单个年份间隔值,得到 118 或 199 年。然后它将最后三位数字(从 mod(num, 1000) 开始)视为该年的天数,方法是乘以一天的间隔。然后将两者添加到固定日期 1899-12-31。 (您可以改用 1900-01-01,但最后必须减去一天...)