Oracle - ORA-01840:输入值不够长,不适合日期格式

时间:2014-12-19 15:54:23

标签: oracle

我有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

4 个答案:

答案 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