日期变量为

时间:2018-10-15 21:09:56

标签: sql oracle

我正在使用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类型时过滤不起作用吗?

2 个答案:

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