我有query
这样的
SELECT test_VALUE FROM testTable
WHERE TO_DATE("test", 'yyyy-mm-dd') >= (TO_DATE('2012-01-01', 'yyyy-mm-dd') + '30'
执行此query
时,我获取原始数据。但是当我将30
替换为另一个inner select query
时,就像这样
select test_value from testtable
where TO_DATE("test", 'yyyy-mm-dd') >= (TO_DATE('2012-01-01', 'yyyy-mm-dd') +
(select test_Value1 from testtable where some_condition=1)
我收到错误ORA-01840: input value not long enough for date format
仅内部查询select test_Value1 from testtable where some_condition=1
将输出结果30
答案 0 :(得分:2)
我也遇到了同样的错误。 我为我的问题得到了RCA,因为其中一个记录具有导致此问题的不同值。 确保列中的所有数据都有正确的数据。
答案 1 :(得分:0)
您使用隐式数据类型转换进行查询,因此您不应对某些奇怪的行为感到惊讶。这意味着你的表达式产生的结果是DATE和Oracle试图将其转换为日期,因为它需要进行比较。
更准确地说,
select test_value from testtable
where TO_DATE("test", 'yyyy-mm-dd') >= DATE '2012-01-01' +
(select to_number(test_Value1) from testtable where some_condition=1)
您将获得成功或获得更具描述性的错误消息。顺便说一句,你的SQL意味着testtable。“test”不是DATE本身 - 为什么?
答案 2 :(得分:0)
如果您的查询直接运行,例如Oracle SQL Developer与30
一起运行,您是否运行select test_Value1 from testtable where some_condition=1
并获得30
?将test_Value1
更新为30
,其中some_condition
等于1,这样您就可以返回30,然后重新运行查询。
好像你也有一个拼写错误 - 缺少右括号:
>= (TO_DATE('2012-01-01', 'yyyy-mm-dd') +
(select test_Value1 from testtable where some_condition=1))
如果日期作为空字符串出现,则可能发生错误。可能无法从最终查询中添加值,因为缺少右括号,可能会使值为空。
另外,不确定,但我不认为在直接添加30
时需要单引号。你说你有原始列表,这听起来好像没有给你30天或更大的物品,就像它看起来你想要的那样。
答案 3 :(得分:0)
当期望的数据类型是datetime并且列中有NULL时,我收到此错误。 对我来说,快速解决方法是使用一个简单的IS NOT NULL来从列中过滤出NULL,其中包含预期的日期时间值。
因此,您应确保输入查询未返回NULL