将yyyy-mm-dd转换为mm / dd / yyyy

时间:2016-06-30 09:45:34

标签: sql oracle

我正在尝试转换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, 我很困惑和厌倦了,有人可以看看吗?

2 个答案:

答案 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