在 Oracle 中将非标准数字日期值转换为 DATE

Converting an non-standard numeric date value to DATE in Oracle

我正在 SQL Server 2012 中使用基于 Oracle 的链接服务器工作。我正在尝试将已知日期字段 (Oracle) 转换为 SS 中的 DATE 格式。例如:

Have ------> Need
115001 | 01/01/2015
116366 | 12/31/2016

我看到了模式,但我不知道 a) 这是什么格式(Oracle 专有??)或 b) 如何在没有一大堆函数的情况下将它转换为字符串。我以为是 Julian,但我看过的每一个 Julian 转换器都告诉我这不是 Julian 日期!同样,我在 T-SQL 而不是 Oracle SQL.

中编码

如有任何见解,我们将不胜感激!谢谢!

CREATE TABLE test_julians
( cyyddd CHAR(6)
);
INSERT INTO test_julians VALUES ( '112306' );
INSERT INTO test_julians VALUES ( '112068' );
INSERT INTO test_julians VALUES ( '113001' );
INSERT INTO test_julians VALUES ( '112307' );
INSERT INTO test_julians VALUES ( '113365' );
INSERT INTO test_julians VALUES ( '115001' );

SELECT cyyddd
     , DATEADD(D,SUBSTRING(cyyddd,4,3)-1  -- add "ddd" days minus one
          , CONVERT(DATE
              , '20'
                   + SUBSTRING(cyyddd,2,2) + '-01-01') ) AS new_date
  FROM test_julians ;

如果有问题的奇数日期格式是数值,那么您可以执行以下操作:

SELECT DATEADD(day, odd_date % 1000 - 1, DATEADD(year, FLOOR(odd_date/1000), '1900-01-01'))
  FROM my_odd_date_table;

也就是说,我们首先将 odd_date 除以 1000 添加到 20 世纪的第一天(这将得到指定年份的第一天),然后加上 odd_date 模 1000 减去一天。这应该适用于 20 世纪的值(例如,95101)以及 21 世纪等

如果 odd_date 是 VARCHAR 而不是数值,您仍然可以通过 CAST 将其转换为数字来使用上面的内容。但是,如果一个或多个值中存在错误数据,这可能会很困难。

我认为您对链接 Oracle table 中数据的存储方式没有任何控制或影响?日期应存储为日期(这就是 DBMS 具有日期数据类型的原因)。我见过一些奇怪的日期格式,但这一个可能是最奇怪的。在具有强大日期算法和功能的 Oracle 中执行此操作似乎特别奇怪(恕我直言,比 SQL 服务器的更好)。