2013-05-07 60 views
0

我有以下的SQL语句,我想获取记录,问题是我无法获得一个记录,即使日期匹配。无法获取所有记录与日期条件

SQLFiddle

SELECT distinct vname,start_date 
FROM my_dates 
where 
start_date >= to_date('30-APR-2013','DD-MON-YYYY HH12:MI:SS AM') 
and start_date <= to_date('06-MAY-2013','DD-MON-YYYY HH12:MI:SS AM') 

我在做什么毛病我查询?

+0

我的眼球告诉我你的日期格式图片与你使用的日期格式不匹配。 – 2013-05-07 08:18:55

+0

@DavidAldridge即使我从查询中删除HH12:MI:SS AM,我也无法得到最后一行 – user75ponic 2013-05-07 18:57:05

回答

2

因为你没有在你的标准语句的TO_DATE部分指定的小时,分​​钟或秒,甲骨文默认为00:00:00,所以你的陈述基本上说要寻找值为start_date is between "30-APR-2013 00:00:00 AM" AND "06-MAY-2013 00:00:00 AM"。由于“06-MAY-2013 6:59:00 AM”超出此范围,因此不会在结果中返回。这里有几种方法可以解决这个问题:

指定TO_DATE语句中的小时数,分钟数和秒数,以包含日期范围后端的整个一天。

SELECT DISTINCT vname,start_date 
    FROM my_dates 
WHERE start_date BETWEEN TO_DATE('30-APR-2013','DD-MON-YYYY') 
         AND TO_DATE('06-MAY-2013 11:59:59 PM','DD-MON-YYYY HH12:MI:SS AM') 

或者你可以做一个计算,以23小时59分59秒添加到第二个日期值做上述同样的事情。

SELECT DISTINCT vname,start_date 
    FROM my_dates 
WHERE start_date BETWEEN TO_DATE('30-APR-2013','DD-MON-YYYY') 
         AND TO_DATE('06-MAY-2013','DD-MON-YYYY')+1-(1/24/60/60) 

希望有帮助。

+0

第二种方法将是动态的,所以我不需要硬编码参数?真实场景是我从前端应用程序获取日期参数,它只会传递日期,而不是分钟和秒。 – user75ponic 2013-05-08 09:50:43

+0

是的,如果您只收到日期而不是小时,分钟或秒钟,则第二种选择是一种干净的方式。它会自动将23:59:59添加到第二个日期,因此在第二个日期中任何时间发生的任何start_date都将包含在结果集中。 – mtwaddell 2013-05-08 10:16:56

+0

mtwaddell,非常感谢。 – user75ponic 2013-05-08 11:22:28

0

to_date('06-MAY-2013','DD-MON-YYYY HH12:MI:SS AM')将返回May, 06 2013 00:00:00+0000这是小于06-MAY-2013 6:59:00 AM','DD-MON-YYYY HH12:MI:SS AM因此,你没有得到最后一行。 尝试此查询...

SELECT distinct vname,start_date 
FROM my_dates 
where 
start_date >= to_date('30-APR-2013','DD-MON-YYYY HH12:MI:SS AM') 
and to_char(start_date,'DD.MM.YYYY') <= to_char(start_date,'DD.MM.YYYY') 

Sql fiddle Demo

+0

Amit,即使我从查询中删除了'HH12:MI:SS AM',我也无法获得最后一行 – user75ponic 2013-05-07 07:58:20

+0

请参阅[这里](http://sqlfiddle.com/#!4/8d721/13) – user75ponic 2013-05-07 08:00:18

+0

我编辑了我的答案尝试查询... – 2013-05-07 08:24:40