我在SQL Server 2012中使用基于Oracle的链接服务器。我正在尝试将已知的日期字段(Oracle)作为SS中的DATE格式。例如:
Have ------> Need
115001 | 01/01/2015
116366 | 12/31/2016
我看到了模式,但我不知道a)这是什么样的格式(Oracle专有??)或b)如何在没有一大堆功能的情况下将其转换为字符串。我以为是朱利安,但我看过的每一个朱利安转换器都告诉我,这不是朱利安的约会!我再次使用T-SQL而不是Oracle SQL进行编码。
任何见解都表示赞赏!谢谢!
答案 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的更多)。