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

时间:2015-02-28 00:09:36

标签: sql oracle sql-server-2012

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

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

我看到了模式,但我不知道a)这是什么样的格式(Oracle专有??)或b)如何在没有一大堆功能的情况下将其转换为字符串。我以为是朱利安,但我看过的每一个朱利安转换器都告诉我,这不是朱利安的约会!我再次使用T-SQL而不是Oracle SQL进行编码。

任何见解都表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:1)

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 ;

答案 1 :(得分:1)

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

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世纪的第一天(这将为我们指定指定年份的第一天),然后添加{ {1}}模数1000减去一天。这应该适用于20世纪的价值观(例如odd_date)以及21世纪等。

如果95101是VARCHAR而不是数值,您仍然可以通过odd_date将其用于数字。但是,如果一个或多个值中存在错误数据,则可能很难。

我认为您无法控制或影响数据在链接Oracle表中的存储方式?日期应存储为日期(这就是DBMS具有日期数据类型的原因)。我见过一些奇怪的日期格式,但这个可能是最奇怪的。看起来特别奇怪的是,人们会在Oracle中执行此操作,它具有强大的日期算法和函数(更好的是,恕我直言,比SQL Server的更多)。

相关问题