Oracle ORA-01849:小时必须介于1和12之间

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条件,当我执行它时,由于我给出的静态日期,它给我的小时数必须在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_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小时时间格式时会出现此问题。 有两种解决方案:

  • 在Oracle客户端中转换时间戳/日期格式

    alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS.FF6'

  • 将查询转换为匹配24小时格式

    从测试中选择*其中DOB>TRUC(时间戳'1970-01-01 20:10:10','HH'); 或

    选择*从测试,其中DOB>到日期('1970-01-01 20:00:00','YYYY-MM-DD HH24:MI:SS')


  • 不工作。。。日期格式图片在转换整个输入字符串之前结束。我已经开始工作了。我已经试过了,但不起作用。我想应该是这样的:
    到目前为止('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') )