SELECT sysdate as today,
to_date(CONCAT (to_char(sysdate,'MM-DD-YYYY'),
to_char(sysdate,'hh24:mi:ss'))) as time
FROM DUAL
每次执行此查询时,它都会给我ORA-01843: not a valid month
有人可以帮助我吗?
答案 0 :(得分:2)
据我了解,您希望从sysdate中查看时间,如果是这样,您需要选择:
SELECT sysdate as today,
to_char(sysdate,'MM-DD-YYYY hh24:mi:ss'))) as time
FROM DUAL
在你的例子中,错误的部分是to_date,你应该使用to_date的掩码:
to_date(CONCAT (to_char(sysdate,'MM-DD-YYYY'),
to_char(sysdate,'hh24:mi:ss')),'MM-DD-YYYY hh24:mi:ss')
但是这将返回与sysdate
完全相同,因为这两列都是日期,日期的格式取决于变量NLS_DATE_FORMAT,请检查here
答案 1 :(得分:2)
to_date(CONCAT(to_char(sysdate,'MM-DD-YYYY'), to_char(sysdate,'hh24:mi:ss')))作为时间
你在做什么根本没用。您分别提取日期和时间部分,然后将其转换回 DATE 。它只不过是 SYSDATE 。
如果您正在提取并显示日期和时间元素,那将是有意义的。或者,您将日期和时间分别设为字符串文字,现在您想将其转换为 DATE 。
例如,
SQL> alter session set nls_date_format='mm/dd/yyyy hh24:mi:ss';
Session altered.
SQL> SELECT to_date(CONCAT ('01/11/2016', '14:45:20'), 'MM/DD/YYYYHH24:MI:SS') my_date
2 FROM DUAL;
MY_DATE
-------------------
01/11/2016 14:45:20
ORA-01843:不是有效月份
<强>原因强>
这主要是由于 NLS依赖。由于您没有使用明确的格式掩码,因此Oracle会尝试根据您的特定于语言环境的NLS设置隐式转换它。
示例强>
让我们改变会话的NLS格式:
SQL> alter session set nls_date_format='dd/mon/yyyyhh24:mi:ss';
Session altered.
让我们执行相同的查询:
SQL> SELECT to_date(CONCAT ('01/11/2016', '14:45:20')) my_date
2 FROM DUAL;
SELECT to_date(CONCAT ('01/11/2016', '14:45:20')) my_date
*
ERROR at line 1:
ORA-01843: not a valid month
正如预期的那样,它会抛出ORA-01843: not a valid month
。