好的,我正在尝试将varchar列转换为Oracle中的时间戳。
所有数据似乎都是'2012-02-01 11h35m34s 360'的形式,除了最后的360之外没什么问题。绝大多数记录以'360'结尾。我在中央时间,距格林威治标准时间6小时,所以我假设这是几分钟内的时区偏移(出于某种原因)。
我正在寻找一种在TO_TIMESTAMP()中读取该偏移量的好方法,或者用于处理它的任何其他好方法。除了标准的偏移格式之外,我还没有找到任何其他信息。
答案 0 :(得分:2)
使用TIMESTAMP WITH TIME ZONE
数据类型保存Oracle中的数据,如in these docs所述。
我花了一些时间把它放在一起,但是这里有一些可以用来进行转换的功能。 (免责声明:我不会对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')
答案 1 :(得分:0)
此示例假定所有日期的格式相同。您可以将日期部分进一步转换为_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