ORA-01849:小时必须在1到12之间

Yog*_*esh 11 oracle

WHERE (ResTRRequest.RequestTime BETWEEN TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')), 'YYYY-MM-DD HH24:MI:SS') 
AND TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND, 'YYYY-MM-DD HH24:MI:SS'))
Run Code Online (Sandbox Code Playgroud)

当我执行它时,我在查询条件的上方,它给我时间必须介于1到12之间,因为我给出的静态日期即''2012-12-01 20:10:10','HH')'如果我把sysdate的工作正常,但由于静态日期,它给了我错误.

Dav*_*ber 13

让我们稍微分解一下:

WHERE (ResTRRequest.RequestTime
  BETWEEN TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')), 'YYYY-MM-DD HH24:MI:SS') 
     AND TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND, 'YYYY-MM-DD HH24:MI:SS'))
Run Code Online (Sandbox Code Playgroud)

首先,我认为你不是这个意思:TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH'))我想也许你的意思是:TRUNC(TO_DATE('2012-12-01 20:10:10'), 'HH').1-12错误的数字来自于您有一个小时20并且正在尝试将其转换为掩码为的日期HH.但正如我所说,我认为这是一个错字.你也可以TIMESTAMP在这里使用文字,而不是TO_DATE():

TRUNC(TIMESTAMP'2012-12-01 20:10:10', 'HH')
Run Code Online (Sandbox Code Playgroud)

第二,只是为了解决这个问题,您是将日期或时间戳存储为字符串吗?那不是个好主意.

第三,BETWEEN在日期比较中使用它并不是一个好主意,因为你可能会错过边缘情况.最好重写如下:

WHERE ( ResTRRequest.RequestTime >= TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10'), 'HH'), 'YYYY-MM-DD HH24:MI:SS') 
    AND ResTRRequest.RequestTime < TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '1' HOUR, 'YYYY-MM-DD HH24:MI:SS') )
Run Code Online (Sandbox Code Playgroud)


小智 9

问题是在面具:

TO_DATE('2012-12-01 20:10:10', 'HH')
Run Code Online (Sandbox Code Playgroud)

换成这个:

TO_DATE('2012-12-01 20:10:10', 'HH24')
Run Code Online (Sandbox Code Playgroud)

  • 不工作...日期格式图片在转换整个输入字符串之前结束。我得到了这个工作。我已经尝试过了 (2认同)