使用SQL筛选日期范围


Filter a range of dates with SQL

我必须从当前日期开始过滤SQL的结果,并显示当前日期+ 10天之前的所有记录。因此,如果是12月22日,我应该显示从那天开始的所有记录,而不是1月1日之后的记录。我该怎么做呢?我尝试了一个简单的查询,像下面的一个,但它似乎只显示记录,直到当前月的最后一天,然后而不是显示下一年的记录回到当前年的第一个月。

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

编辑1

我正在使用Symfony 2 + Doctrine 2 querybuilder,所以查询必须与它们兼容

编辑2

我用这个PHP代码

使用eggyal建议的查询解决了Doctrine 2的问题
$queryBuilder->where($queryBuilder->expr()->gte('mydatefield', 'CURRENT_DATE()'))->andWhere($queryBuilder->expr()->lte('mydatefield', 'DATE_ADD(CURRENT_DATE(), 10, ''DAY'')'));

问题在于您错误地使用了MySQL的DAY()函数,该函数返回月份的天。你应该用DATE()代替;您还可以使用BETWEEN ... AND ...比较运算符进行简化:

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

注意,为了从索引优化中获益,您可以这样做:

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

你应该能够使用这个:

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

参见SQL Fiddle with Demo

try this

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