oracle日期过滤器未返回预期记录

时间:2012-08-20 20:04:28

标签: plsql oracle11g nsdateformatter

我有一个oracle DATE列,该列的特定记录的值是

16/10/2005 11:13:34 AM.

现在我正在安装一个这样的过滤器,过滤器字符串从前端传入。

date_col between to_date('16-10-2005','DD-MM-YYYY') and to_date('16-10-2005','DD-MM-YYYY') 

它返回零记录。为什么会这样?我想oracle将返回所有日期为16/10/2005的记录,无论时间如何。 我是否也需要及时通过/从前端,我只得到日期,而不是时间。

3 个答案:

答案 0 :(得分:2)

date_col between to_date('16-10-2005','DD-MM-YYYY') 
     and to_date('16-10-2005','DD-MM-YYYY') 

仅返回2005年10月16日午夜的DATE值。如果您想在2005年10月16日的任何时间获取数据

date_col between to_date('16-10-2005','DD-MM-YYYY') 
             and to_date('16-10-2005 23:59:59','DD-MM-YYYY HH24:MI:SS') 

会做到的。

date_col between to_date('16-10-2005','DD-MM-YYYY') 
             and to_date('17-10-2005','DD-MM-YYYY') - interval '1' second

如果你没有减去那一秒,你也最终会在2005年10月17日拉出date_col午夜价值的行。

您还可以将trunc功能应用于date_col

trunc(date_col) = date '2005-10-16'

但这会阻止使用date_col上的标准索引。您通常需要在trunc(date_col)

上创建基于函数的索引
CREATE INDEX idx_trunc_date_col
    ON table_name( trunc(date_col) );

答案 1 :(得分:2)

是的 - 你需要一个时间元素。

to_date('16 -10-2005','DD-MM-YYYY')默认为午夜 - 所以要检索16/10/05的所有记录,你可以使用

date_col >= to_date('16-10-2005','DD-MM-YYYY')
and date_col < to_date('17-10-2005','DD-MM-YYYY')

答案 2 :(得分:1)

将第二天的最后日期减去1秒......

date_col between to_date('16-10-2005','DD-MM-YYYY') 
    and to_date('16-10-2005 23:59:59','DD-MM-YYYY HH:MI:SS')