Sql ORA-01843:使用to_date函数时不是有效的月份错误

Sql ORA-01843:使用to_date函数时不是有效的月份错误,sql,database,oracle,datetime,date-formatting,Sql,Database,Oracle,Datetime,Date Formatting,每次我执行这个查询时,它都会给我ORA-01843:不是有效的月份 有人能帮我吗?据我所知,您想查看sysdate的时间,如果需要,请选择: SELECT sysdate as today, to_date(CONCAT (to_char(sysdate,'MM-DD-YYYY'), to_char(sysdate,'hh24:mi:ss'))) as time FROM DUAL 在您的示例中,错误的部分是截止日期,您应该使用截止日期的掩码: SE

每次我执行这个查询时,它都会给我ORA-01843:不是有效的月份


有人能帮我吗?

据我所知,您想查看sysdate的时间,如果需要,请选择:

SELECT sysdate as today,
       to_date(CONCAT (to_char(sysdate,'MM-DD-YYYY'),
               to_char(sysdate,'hh24:mi:ss'))) as time
FROM DUAL
在您的示例中,错误的部分是截止日期,您应该使用截止日期的掩码:

SELECT sysdate as today,
       to_char(sysdate,'MM-DD-YYYY hh24:mi:ss'))) as time
FROM DUAL
但这将返回与sysdate完全相同的结果,因为这两列都是date,并且日期的格式取决于变量NLS_date_format,请检查

至_dateCONCAT至_charsysdate,'MM-DD-YYYY', 到_charsysdate,'hh24:mi:ss'作为时间

你所做的一切都是无用的。您将分别提取日期和时间部分,然后将其转换回日期。它只不过是SYSDATE本身

如果您正在提取和显示日期和时间元素,这将是有意义的。或者,将日期和时间分别作为字符串文字,现在希望将其转换为日期

比如说,

to_date(CONCAT (to_char(sysdate,'MM-DD-YYYY'),
               to_char(sysdate,'hh24:mi:ss')),'MM-DD-YYYY hh24:mi:ss')
ORA-01843:不是有效月份

理由

这主要是由于NLS依赖性造成的。由于您没有使用显式格式掩码,Oracle正在尝试根据您特定于语言环境的NLS设置隐式转换它

范例

让我们更改会话的NLS格式:

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
让我们执行相同的查询:

SQL> alter session set nls_date_format='dd/mon/yyyyhh24:mi:ss';

Session altered.

正如预期的那样,它抛出ORA-01843:不是有效的月份。

到\u dateCONCAT到\u charsysdate,'MM-DD-YYYY',到\u charsysdate,'hh24:mi:ss'将返回与sysdate完全相同的结果。如果您想查看时间,需要_charsysdate,'MM-DD-YYYY hh24:mi:ss',并且sysdate不是今天,而是现在。如果您想去掉时间部分,请使用truncsysdate。如果只想显示日期部分,请使用to_char:例如to_charsysdate,'MM-DD-YYYY'。如果您直接选择sysdate,您将获得完整的datetime,它的显示方式取决于GUI设置。非常感谢@Tatiana:@Tatiana这是一个友好的建议,您所指的站点在Oracle社区中没有很好的声誉。
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