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

5anewei6  于 2023-08-04  发布在  Oracle
关注(0)|答案(6)|浏览(96)
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'))

字符串
我有上面的查询条件,当我执行它,它给我的时间必须在1至12之间,由于静态日期,我已经给了,即“2012 -12-01 20:10:10”,“HH”)“如果我把系统日期的工作罚款,但由于静态日期,它给我的错误。

9cbw7uwe

9cbw7uwe1#

让我们把它分解一下:

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'))

字符串
首先,我不认为你是这个意思: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')

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

第三,在日期比较中使用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') )

igetnqfo

igetnqfo2#

问题出在面罩上:

TO_DATE('2012-12-01 20:10:10', 'HH')

字符串
替换为以下内容:

TO_DATE('2012-12-01 20:10:10', 'HH24')

i7uaboj4

i7uaboj43#

假设ResTRRequest.RequestTime是日期类型,则Where子句将工作:

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(<whatever>, 'YYYY-MM-DD HH24:MI:SS')


但不是

TO_CHAR(<whatever>, 'MM/DD/YYYY HH24:MI:SS')

plupiseo

plupiseo4#

如果将Oracle上的语言设置设置为使用12小时时间,则在转换24小时时间格式时会出现此问题。对此有两种解决方案:
1.在Oracle客户端中转换TIMESTAMP/DATE格式
alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS.FF6';
1.转换查询以匹配24小时格式
SELECT * FROM TEST_ WHERE DOB > TRUNC(TIMESTAMP'1970-01-01 20:10:10',' HH ');或者是
SELECT * FROM TEST_ WHERE DOB > to_date('1970 -01-01 20:00:00','YYYY-MM-DD HH24:MI:SS');

qlckcl4x

qlckcl4x5#

在出现此错误的情况下,需要注意的另一件事是数据本身。我有一个存储在xml标签中的日期,我必须解析并转换为TO_DATE,格式说明符为'MM/dd/YYYY HH:MI:SS AM'。SQL因“ORA-01849:小时必须介于1和12之间”,因为有些记录是这样写的:“2017年12月20日16:45:00 PM”。注意16 h和PM规范。

xpcnnkqh

xpcnnkqh6#

Oracle将时间戳默认为12 h时间系统。您需要通过在格式中添加24来指明它是00-24小时制。参见:to_date('16/10/2023 00:00:22', 'DD/MM/YYYY HH24:MI:SS')
请注意,HH已更改为HH24

相关问题