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”)“如果我把系统日期的工作罚款,但由于静态日期,它给我的错误。
6条答案
按热度按时间9cbw7uwe1#
让我们把它分解一下:
字符串
首先,我不认为你是这个意思:
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()
:型
第二,为了解决这个问题,您是否将日期或时间戳存储为字符串? 这不是个好主意**
第三,在日期比较中使用
BETWEEN
不是一个好主意,因为您可能会错过边缘情况。最好重写如下:型
igetnqfo2#
问题出在面罩上:
字符串
替换为以下内容:
型
i7uaboj43#
假设
ResTRRequest.RequestTime
是日期类型,则Where
子句将工作:字符串
如果您必须比较字符表示,请记住您是按字典顺序进行比较的,这意味着字符串的前缀在其字符串之前排序!通过使用相同的格式模型,将组件按重要性递减的顺序排列,避免随之而来的复杂性。例如:
型
但不是
型
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');
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规范。
xpcnnkqh6#
Oracle将时间戳默认为12 h时间系统。您需要通过在格式中添加
24
来指明它是00-24小时制。参见:to_date('16/10/2023 00:00:22', 'DD/MM/YYYY HH24:MI:SS')
请注意,
HH
已更改为HH24
。