2

好的,我正在尝试将 varchar 列转换为 Oracle 中的时间戳。

数据似乎都是'2012-02-01 11h35m34s 360'的形式,除了最后的360之外,这很好。绝大多数记录以“360”结尾。我在中央时间,距格林威治标准时间 6 小时,所以我假设这是时区偏移量(以分钟为单位)(出于某种原因)。

我正在寻找一种在 TO_TIMESTAMP() 中读取该偏移量的好方法,或者寻找任何其他处理它的好方法。除了标准偏移格式之外,我无法找到任何其他信息。

4

2 回答 2

2

TIMESTAMP WITH TIME ZONE这些文档中所述,使用数据类型将数据保存在 Oracle中。

我花了一些时间才把它放在一起,但这里有一些函数可以用来进行转换。(免责声明:我对 Oracle 做的不多,所以可能有更优化的方法来做到这一点。)

CREATE OR REPLACE FUNCTION minutes_to_offset (minutes IN NUMBER)
RETURN VARCHAR
IS
BEGIN
  RETURN TO_CHAR(TRUNC(-minutes / 60)) || ':' ||
         LPAD(TO_CHAR(ABS(MOD(minutes,60))),2,'0');
END;
/

CREATE OR REPLACE FUNCTION mytimestamp (ts IN VARCHAR)
RETURN TIMESTAMP WITH TIME ZONE
IS
BEGIN
  RETURN FROM_TZ(
    TO_TIMESTAMP (SUBSTR(ts, 0, 20), 'YYYY-MM-DD HH24"h"MI"m"SS"s"')
  , minutes_to_offset(TO_NUMBER(SUBSTR(ts,22))));
END;

然后你可以对你的字段使用该功能

mytimestamp('2012-02-01 11h35m34s 360')

这是一个用于演示的有效 SQL Fiddle。

于 2013-05-02T00:43:40.037 回答
0

此示例假定所有日期的格式相同。您可以将日期部分进一步转换为 to_date() 或 to_timestamp() 然后 concat。它与 360 或任何其他号码:

-- Can use To_Timestamp instead of To_Date --
 SELECT TO_CHAR(TO_DATE(dt, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS')||' '||360 Final_Date
   FROM
   (
   SELECT REPLACE(REPLACE(REPLACE('2012-02-01 11h35m34s', 'h', ':'), 'm', ':'), 's', '') dt 
     FROM dual
   )
  /

输出:

2012-02-01 11:35:34 360
于 2013-05-02T12:53:36.070 回答