2012-12-21 3 views
3

Мне нужно отфильтровать результаты SQL начиная с текущего дня и отображать все записи до текущего дня + 10 дней. Так что, если 22 декабря, я должен показать все записи, начиная с этого дня, и это не после 1 января. Как я могу это сделать? Я попробовал простой запрос, подобный приведенному ниже, но он, кажется, отображает только записи до последнего дня текущего месяца, а затем вместо того, чтобы показывать записи следующего года, восходит к первому месяцу текущего года.Отфильтровать диапазон дат с помощью SQL

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

EDIT 1

Я использую Symfony 2 + Doctrine 2 QueryBuilder поэтому запрос должен быть совместим с ними

EDIT 2

Я решил Учение 2 проблема, используя запрос, предложенный eggyal с этим кодом 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-from-today) – Barmar

ответ

6

Проблема заключается в вашем ошибочном использовании DAY() функции MySQL, которая возвращает день месяца. Вместо этого следует использовать 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 
+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 
Смежные вопросы