TO_DATE函数无法使用时区信息。

时间:2016-05-18 11:40:32

标签: sql oracle to-date

我正在尝试下面:

SELECT TO_CHAR( TO_DATE('Wed May 18 00:00:00 IST 2016', 'DY MON DD HH24:MI:SS TZR YYYY'),'DD-MM-YYYY') FROM DUAL;

并期待18-05-2016

但它说 - 01821. 00000 - "日期格式无法识别"

如果我删除IST和相应的TZR,它会很好用。

出了什么问题?

1 个答案:

答案 0 :(得分:3)

Oracle DATE数据类型does not have a time zone component。一个普通的TIMESTAMP也没有。您需要转换为TIMESTEMP WITH TIME ZONE:

SELECT TO_CHAR(TO_TIMESTAMP_TZ('Wed May 18 00:00:00 IST 2016',
  'DY MON DD HH24:MI:SS TZR YYYY', 'NLS_DATE_LANGUAGE=ENGLISH'),
  'DD-MM-YYYY')
FROM DUAL;

但是IST不是公认的时区区域,因此仍然会找到ORA-01882:找不到时区区域。您可能必须使用已知区域明确替换它,例如:

SELECT TO_CHAR(TO_TIMESTAMP_TZ(REPLACE('Wed May 18 00:00:00 IST 2016',
  'IST', 'Asia/Calcutta'), 'DY MON DD HH24:MI:SS TZR YYYY', 'NLS_DATE_LANGUAGE=ENGLISH'),
  'DD-MM-YYYY')
FROM DUAL;

TO_CHAR(TO
----------
18-05-2016

或者,如果你不对它进行任何操作并且想要IST年份,你可以直接从字符串中提取日期组件,或者将IST视为固定值而不是尝试解释它:

SELECT TO_CHAR(TO_DATE('Wed May 18 00:00:00 IST 2016',
  'DY MON DD HH24:MI:SS "IST" YYYY', 'NLS_DATE_LANGUAGE=ENGLISH'),
  'DD-MM-YYYY')
FROM DUAL;

TO_CHAR(TO
----------
18-05-2016

......但这可能不适合您的实际情况。