3

我必须从当天开始过滤 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 查询构建器,因此查询必须与它们兼容

编辑 2

我通过使用 eggyal 建议的查询和这个 PHP 代码解决了 Doctrine 2 问题

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

3 回答 3

6

问题在于您错误地使用了 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
于 2012-12-21T17:30:59.737 回答
3

你应该可以使用这个:

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

请参阅带有演示的 SQL Fiddle

于 2012-12-21T17:30:54.853 回答
0

试试这个

SELECT * 
FROM mytable 
WHERE DATE( mydatefield ) BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL 10 DAY
于 2012-12-21T17:31:20.143 回答