数据库列(VARCHAR2
数据类型)将日期/时间存储为13位(毫秒)
)unixtimestamp格式。现在,当我想将列与oracle日期(有问题)进行比较时,错误被抛出为'无效数字'
我尝试了两种方式,
这里'价值'是VARCHAR2
数据类型的第13位unixtimestamp列。
select
TO_DATE('1970-01-01', 'YYYY-MM-DD') + value/86400000,
TO_DATE('2014-04-21', 'YYYY-MM-DD')
from dummytable
-- where and TO_DATE('1970-01-01', 'YYYY-MM-DD') + value/86400000 > TO_DATE('2014-04-21', 'YYYY-MM-DD')
select
value,
(to_date('2013-04-21', 'YYYY-MM-DD') - to_date('1970-01-01', 'YYYY-MM-DD')) * (1000*24*60*60)
from dummytable
-- where value > ((to_date('2013-04-21', 'YYYY-MM-DD') - to_date('1970-01-01', 'YYYY-MM-DD')) * (1000*24*60*60))
任何指针?提前谢谢。
[编辑 - 1天后]我现在看到了问题。有一些数据(其他行)用于'值'非数字的列。但我还有另一栏专栏,其中总是字段=' date'返回值为13位时间戳。现在我想当'哪里有'条件执行,虽然字段=' date'在这种情况下,它仍在验证其他值的值'这是非数字的。有没有办法避免这种情况?
答案 0 :(得分:2)
您的代码运行正常。问题出在您的数据中。您的部分values
不是数字。
create table test
(value varchar2(13));
insert into test(value) values('2154534689000');
--insert into test(value) values('2 54534689000');
select TO_DATE('1970-01-01', 'YYYY-MM-DD') + value/86400000
from test
where TO_DATE('1970-01-01', 'YYYY-MM-DD') + value/86400000 > TO_DATE('2014-04-21', 'YYYY-MM-DD');
此代码工作正常。但是,如果您取消注释第二个插入内容,则会得到完全相同的invalid number
错误。
UPD。艾伦给了你一个很好的暗示,但我觉得向你解释一下观点可能会很好。您从视图中选择的事实可能会有所不同。视图不会存储在物理上的某个地方,当您从中进行选择时,它只会被添加到您的查询中#34;。然后Oracle Query Optimizer开始工作。除此之外,它还可以更改where
谓词的评估顺序。
例如,您的视图查询可以有一行where value is not null
,它通常只会显示“好”字样。值。但是,如果您的查询具有谓词{{1}},Oracle可以决定更早地评估您的谓词,因为Oracle预测它将会切断"切断"更多行,从而使整个查询更快,更少momery消费。当然,由于尝试将空字符串转换为日期,执行将崩溃。
我相信,艾伦在回答中给出了一个链接,给了解决这个问题的好方法:"包装"您在子查询中的查询,Oracle无法解开":
where to_date(value,'ddmmyyyy') > sysdate
希望有所帮助。