我正在尝试转换YYYY-MM-DD HH24:MM:SS INTO MM / DD / YYYY HH24:MM:SS
最后一次尝试是:
SQL> select to_date(to_date('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS'),'MM/DD/YYYY HH24:MI:SS') from dual
我收到的错误是:无效的monhts, 我很困惑和厌倦了,有人可以看看吗?
答案 0 :(得分:4)
日期没有格式 - 它们由7- or 8- bytes在内部表示。只有当客户端程序通过该客户端程序(可能)为其提供格式的日期时。
SQL / Plus或SQL Developer中日期的默认字符串格式由NLS_DATE_FORMAT
session参数设置。其他客户端通常会为默认日期格式设置参数(如果他们也不使用NLS
设置)。但是,请注意NLS_DATE_FORMAT
是一个会话参数,因此它属于用户的会话,并且每个用户可以使用与其设置方式相对应的参数的不同值。
如果您想以特定格式指定日期,则需要将其转换为字符串:
SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM DUAL;
为什么您的查询不起作用:
TO_DATE( value, frmt )
需要字符串值和格式掩码。内部TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
完全有效,将返回DATE '2016-05-01'
。
然而,外部TO_DATE()
将被传递您刚刚生成的DATE
类型和字符串格式(而不是它期望的两个字符串)。 Oracle将在日期隐式调用TO_CHAR()
并使用NLS_DATE_FORMAT
session参数作为格式掩码。这是从日期生成一个字符串,并且在给定错误的情况下,NLS_DATE_FORMAT
的值不是MM/DD/YYYY HH24:MI:SS
所以当外部TO_DATE()
尝试解析隐式创建的字符串时,它将作为第一个失败它读取的数字在一个月内无效。
答案 1 :(得分:1)
这应该有效。使用to_char
select to_char(to_date('2016-05-01 00:00:00','YYYY-MM-DD
HH24:MI:SS'),'MM/DD/YYYY HH24:MI:SS') from dual