【问题标题】:Filter a range of dates with SQL使用 SQL 过滤一系列日期
【发布时间】:2012-12-09 07:02:21
【问题描述】:

我必须过滤从当天开始的 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\')'));

【问题讨论】:

标签: php mysql datetime symfony filter


【解决方案1】:

问题在于您错误地使用了 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

【讨论】:

  • +1。就使性能调整成为可能而言,在比较中使用裸列(与包装在函数中)确实是要走的路。并且使用&gt;=&lt; 进行范围比较,该方法适用于检查除整数天之外的DATETIME 范围,从一天的午夜到另一天的午夜。
  • 我忘了说我使用的是 Doctrine 2 和 PHP,所以查询只能使用纯 SQL。我需要一种在学说 querybuilder 中使用它的方法
【解决方案2】:

你应该可以使用这个:

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

SQL Fiddle with Demo

【讨论】:

    【解决方案3】:

    试试这个

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

    【讨论】:

      猜你喜欢
      • 2011-06-10
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      相关资源
      最近更新 更多