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

我的查询做错了什么?

4

2 回答 2

2

因为您没有在条件语句的 TO_DATE 部分中指定小时、分钟或秒,所以 Oracle 默认为 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)

希望有帮助。

于 2013-05-07T22:43:35.883 回答
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 小提琴演示

于 2013-05-07T07:55:53.553 回答