我正在使用Oracle 10g数据库。我的桌子上有很多信息。其中一列的DATE类型声明为DATE_INSERT DATE
。我正在尝试进行查询,并按特定的日期进行过滤。当我在where子句中使用函数TO_CHAR()
时,按预期方式获取信息
SELECT * FROM TABLE WHERE TO_CHAR(DATE_INSERT, 'DD/MM/YYYY') = '05/10/2018'
但是当我使用DATE变量或TO_DATE()
函数时,我得到的结果集为空。
SELECT * FROM TABLE WHERE DATE_INSERT = TO_DATE('05/10/2018','DD/MM/YYYY')
OR
SELECT * FROM TABLE WHERE DATE_INSERT = date '2018-10-05';
OR({date_var
之前定义为日期)
SELECT * FROM TABLE WHERE DATE_INSERT = date_var;
根据数据库部门的要求,我需要摆脱所有函数TO_DATE()/ TO_CHAR()。您能帮我知道为什么在查询中使用DATE类型时过滤不起作用吗?
答案 0 :(得分:2)
这是由于时间因素。我建议:
WHERE DATE_INSERT >= date '2018-10-05' AND
DATE_INSERT < date '2018-10-06'
或者:
WHERE TRUNC(DATE_INSERT) = date '2018-10-05'
Oracle支持基于函数的索引。如果您希望使用索引,则可以创建一个索引来支持这两个查询。
答案 1 :(得分:0)
在Oracle中,DATE
列始终存储日期和时间信息。所以您提到的查询:
选择*从表中TO_CHAR(DATE_INSERT,'DD / MM / YYYY')= '05 / 10/2018'
不使用相等,而是查询范围。哪个范围?一整天,就是24小时。
对于其他查询,您需要使用一个范围,例如:
SELECT * FROM TABLE
WHERE DATE_INSERT >= TO_DATE('05/10/2018','DD/MM/YYYY')
AND DATE_INSERT < TO_DATE('06/10/2018','DD/MM/YYYY')
更清楚地显示日期和时间信息:
SELECT * FROM TABLE
WHERE DATE_INSERT >= TO_DATE('05/10/2018 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND DATE_INSERT < TO_DATE('06/10/2018 00:00:00','DD/MM/YYYY HH24:MI:SS')