我正在尝试下面:
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,它会很好用。
出了什么问题?
答案 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
......但这可能不适合您的实际情况。