oracle to_date转换显示文字与字符串格式不匹配

时间:2014-11-03 09:08:30

标签: oracle

如果我使用转换器进行unixtime,我会得到

2005年5月31日星期二16:23:17 GMT 1117556597.如果我运行以下查询,我收到错误 literal与字符串格式不匹配。那是为什么?

select to_date('1117556597','yyyy-mm-dd HH:MI:SS') from dual

2 个答案:

答案 0 :(得分:1)

TO_DATE方法尝试将输入与提供的模式匹配。例如:

TO_DATE('2003/07/09', 'yyyy/mm/dd')
TO_DATE('070903', 'MMDDYY')
TO_DATE('20020315', 'yyyymmdd')

您可以查看http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions183.htm

我想这会对你有帮助(没有经过考验)

SELECT TO_CHAR(TO_DATE('01-JAN-1970','DD-MON-YYYY HH24:MI:SS') + 
( 1117556597/ (1000*60 * 60 * 24) ),'DD-MON-YYYY HH24:MI:SS') "DATE" FROM DUAL ;

答案 1 :(得分:1)

19700101是1970年1月1日。这是" epoch"对于UNIX系统。 UNIX系统通过计算自" epoch"以来的秒数来跟踪时间。

你需要convert这样,

SQL> SELECT TO_DATE('19700101','yyyymmdd')  + (1117556597/24/60/60) thedate
  2  FROM dual
  3  /

THEDATE
---------
31-MAY-05

让我们看一下完整的datetime

SQL> SELECT to_char(TO_DATE('19700101','yyyymmdd')  + (1117556597/24/60/60),'DD-MON-YYYY HH24:MI:SS') thedate
  2  FROM dual
  3  /

THEDATE
--------------------
31-MAY-2005 16:23:17

SQL>

编辑关于TIMEZONE

最好明确提及时区。

您可以在文字本身中提及时区,或将其投放为UTC并将其转换为local timezone

SELECT
  TO_CHAR (
    FROM_TZ (
      CAST (DATE '1970-01-01 + (1117556597/24/60/60) AS TIMESTAMP),
      'UTC')
    AT TIME ZONE 'your local timezone',
  'MM/DD/YYYY HH24:MI:SS')
FROM dual;

注意请检查语法,我在进行此修改时无法访问数据库。