2012-12-21 180 views
3

我必须从当前日期开始过滤SQL的结果,并显示所有记录,直到当天+ 10天。因此,如果是十二月二十二日,我应该显示当天开始的所有记录,而不是在一月一日之后。我怎样才能做到这一点?我尝试了一个简单的查询,如下所示,但它似乎只显示记录,直到当前月份的最后一天,然后显示下一年的记录可以回到当年的第一个月。使用SQL过滤日期范围

SELECT * 
FROM mytable 
WHERE DAY(mydatefield) >= DAY(CURRENT_TIMESTAMP) 
    AND mydatefield <= DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 10 DAY) 

编辑1

我使用Symfony的2 + 2原则这样的QueryBuilder查询必须与他们

EDIT 2

兼容我解决了2学说问题,通过使用PHP编码提出的查询

$queryBuilder->where($queryBuilder->expr()->gte('mydatefield', 'CURRENT_DATE()'))->andWhere($queryBuilder->expr()->lte('mydatefield', 'DATE_ADD(CURRENT_DATE(), 10, \'DAY\')')); 
+0

可能重复[我如何找到今天的日期和今天X天之间的区别?](http://stackoverflow.com/questions/13981334/how-do-i-find-the-difference-between-todays-date-and -x-days-today) – Barmar

回答

6

问题就出在你的错误使用MySQL的DAY()功能,它返回天月的。你应该使用DATE();

SELECT * 
FROM mytable 
WHERE DATE(mydatefield) BETWEEN CURDATE() AND CURDATE() + INTERVAL 10 DAY 

需要注意的是,为了从索引优化中受益,可以转而做:您还可以用BETWEEN ... AND ...比较操作简化

SELECT * 
FROM mytable 
WHERE mydatefield >= CURDATE() AND mydatefield < CURDATE() + INTERVAL 11 DAY 
+0

+1。在比较中使用裸列(相对于包装在函数中)实际上是一种可行的方法,可以进行性能调整。并且使用'> ='和'<'进行范围比较,该方法适用于检查DATETIME范围,而不是整天数,从一天的午夜到另一天的午夜。 – spencer7593

+0

我忘记说我正在使用Doctrine 2和PHP,所以查询只能用普通的SQL。我需要一种在doctrine querybuilder中使用它的方法 – Stefano

3

您应该能够使用:

SELECT * 
FROM mytable 
WHERE date(mydatefield) >= date(CURRENT_TIMESTAMP) 
    AND date(mydatefield) <= date(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 10 DAY)) 

SQL Fiddle with Demo

0

试试这个

SELECT * 
FROM mytable 
WHERE DATE(mydatefield) BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL 10 DAY