在 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 服务器的更好)。
我正在 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 服务器的更好)。