Oracle ORA-01849:小时必须介于1和12之间
我在查询中有上面的where条件,当我执行它时,由于我给出的静态日期,它给我的小时数必须在1到12之间,即“2012-12-01 20:10:10”,“HH”),如果我将sysdate设置为其工作正常,但由于静态日期,它给我错误。问题在掩码中:Oracle ORA-01849:小时必须介于1和12之间,oracle,Oracle,我在查询中有上面的where条件,当我执行它时,由于我给出的静态日期,它给我的小时数必须在1到12之间,即“2012-12-01 20:10:10”,“HH”),如果我将sysdate设置为其工作正常,但由于静态日期,它给我错误。问题在掩码中: WHERE (ResTRRequest.RequestTime BETWEEN TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')), 'YYYY-MM-DD HH24:MI:SS') AND TO_C
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'))
替换为以下内容:
TO_DATE('2012-12-01 20:10:10', 'HH')
假设
restrest.RequestTime
为日期类型,则此Where
子句将起作用:
TO_DATE('2012-12-01 20:10:10', 'HH24')
如果您必须比较字符表示,请记住,您是按字典顺序进行比较的,这意味着字符串的前缀排序在其字符串之前!通过使用相同的格式模型和按重要性递减顺序排列的组件,避免出现复杂情况。例如
where ResTRRequest.RequestTime
BETWEEN TRUNC(TO_DATE('2015-02-26 20:10:10', 'YYYY-MM-DD HH24:MI:SS'), 'HH')
AND TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND
TO_CHAR(,'YYYY-MM-DD HH24:MI:SS')
但不是
TO_CHAR(<whatever>, 'YYYY-MM-DD HH24:MI:SS')
TO_CHAR(,'MM/DD/YYYY HH24:MI:SS')
让我们把它分解一下:
TO_CHAR(<whatever>, 'MM/DD/YYYY HH24:MI:SS')
首先,我不认为你的意思是:TRUNC(TO_DATE('2012-12-01 20:10:10','HH'))
,我想你的意思可能是:TRUNC(TO_DATE('2012-12-01 20:10:10'),'HH')
。1-12错误的数字来源于这样一个事实,即您有一个小时的20
,并且正试图将其转换为一个带有HH
掩码的日期。但正如我所说,我认为这是一个打字错误。您也可以在此处使用时间戳
文字,而不是TO_DATE()
:
其次,为了解决这个问题,您是否将日期或时间戳存储为字符串?这不是个好主意。
第三,在日期比较中使用interference
不是一个好主意,因为您可能会错过边缘情况。最好将其改写如下:
TRUNC(TIMESTAMP'2012-12-01 20:10:10', 'HH')
其中(restrequest.RequestTime>=TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10'),'HH'),'YYYY-MM-DD HH24:MI:SS'))
和restrequest.RequestTime
如果出现此错误,还需要注意数据本身。
我已经将日期存储在xml标记中,我必须使用此格式说明符“MM/dd/YYYY HH:MI:SS AM”解析并转换为日期。SQL以“ORA-01849:hour必须介于1和12之间”中断,因为有些记录是这样写的:“12/20/2017 16:45:00 PM”。请注意16h和PM规范…如果Oracle上的语言设置设置为使用12小时时间,则在转换24小时时间格式时会出现此问题。 有两种解决方案:
不工作。。。日期格式图片在转换整个输入字符串之前结束。我已经开始工作了。我已经试过了,但不起作用。我想应该是这样的:
到目前为止('2012-12-01 20:10:10','YYYY-MM-DD HH24:MI:SS')
就到了这一点,鉴于OP的代码,我不确定这是一个安全的假设。如果restrest.RequestTime
类型为DATE
或TIMESTAMP
当然会更好。@DavidFaber我同意你的担心。
TRUNC(TIMESTAMP'2012-12-01 20:10:10', 'HH')
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') )