【问题标题】:hour must be between 0 and 23 -oracle小时必须在 0 到 23 之间 -oracle
【发布时间】:2020-04-27 06:14:56
【问题描述】:

我只想将 sysdate 与字符串连接起来。我在 in_date 变量中传递 sysdate。执行以下查询后,

`select to_date('''||in_date||''' || '14:59:59', 'dd-mon-yyyy hh24:mi:ss') from dual;

` 我收到错误ORA-1850:小时必须在 0 到 23 之间

我正在使用 oracle 12c。

谢谢

【问题讨论】:

  • 查看select '''||in_date||''' || '14:59:59' from dual 打印的内容,您可能会注意到问题所在。
  • 我认为时间之前没有空间。

标签: oracle date oracle12c


【解决方案1】:

根据您自己的回答,我认为正确的解决方案是以下之一:

SELECT TRUNC(SYSDATE) + INTERVAL '14:59:59' HOUR TO SECOND FROM dual;

SELECT TRUNC(SYSDATE) + 14/24 + 59/24/60 + 59/24/60/60 FROM dual;

SYSDATE 是一个DATE 值,您应该永远不要在一个已经是DATE 的值上调用TO_DATE()。隐式 Oracle 正在这样做:

SELECT 
 TO_DATE(''|| 
 TO_CHAR(SYSDATE, SYS_CONTEXT('USERENV', 'NLS_DATE_FORMAT')) 
 ||'' || ' 14:59:59', 'dd-mon-yy hh24:mi:ss')  
FROM dual;

因此,结果取决于当前用户会话 NLS_DATE_FORMAT(在您的情况下还取决于 NLS_DATE_LANGUAGE),可能随时更改。

【讨论】:

    【解决方案2】:

    我在时间之前错过了一个空格,并且还将格式“yyyy”更改为“yy”

    select to_date(''||sysdate||'' || ' 14:59:59', 'dd-mon-yy hh24:mi:ss')  from dual;
    
    
    27-04-2020 14:59:59
    

    谢谢..

    【讨论】:

    • SYSDATE value is a DATE NEVER 在已经是 DATE 的值上调用 TO_DATE()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多