Сравните даты только по месяцам и дням - PullRequest
3 голосов
/ 29 января 2012

У меня есть date поле в моей таблице foos.Поэтому теперь мне нужно выбрать все foos из интервала дат, но сравнивать только месяц и день.

Например, мне нужно выбрать все foos за 10 дней до и после 7 Jan 2012 -> 28 Dec - 17 Jan.Или неделю около 10 Jul 2009 -> 3 Jul - 17 Jul.Его следует выбирать в зависимости только от месяца и дня всех лет.

Мой сырой и наивный раствор

SELECT b_date FROM foos 
  WHERE DAYOFYEAR(b_date) BETWEEN 
    DAYOFYEAR('2011-01-07' - INTERVAL 10 DAY) AND (DAYOFYEAR('2011-01-07' - INTERVAL 10 DAY) + 20)
  OR DAYOFYEAR(b_date) BETWEEN 
    (DAYOFYEAR('2011-01-07' + INTERVAL 10 DAY) - 20) AND DAYOFYEAR('2011-01-07' + INTERVAL 10 DAY)
  GROUP BY foos.id;

Ответы [ 2 ]

2 голосов
/ 29 января 2012

Если вы хотите найти все даты 28 Dec 2011 и 17 Jan 2012, вы можете использовать это:

WHERE DateColumn BETWEEN '2012-01-07' - INTERVAL 10 DAY
                     AND '2012-01-07' + INTERVAL 10 DAY

Для более общей проблемы я вижу 2 подхода. Легко написать, но, вероятно, медленно с большой foos таблицей:

SELECT f.*
FROM 
      foos AS f
  CROSS JOIN
      ( SELECT 32 * MONTH(StartDate) + DAY(StartDate)
                 AS StartCheck
             , 32 * MONTH(EndDate) + DAY(EndDate)
                 AS EndCheck 
        FROM
            ( SELECT ('2012-01-07' - INTERVAL 10 DAY) AS StartDate 
                   , ('2012-01-07' + INTERVAL 10 DAY) AS EndDate 
            ) AS c
      ) AS cc
WHERE 32*MONTH(f.DateColumn)+DAY(f.DateColumn) BETWEEN StartCheck 
                                                   AND EndCheck 
   OR  StartCheck > EndCheck 
   AND 32*MONTH(f.DateColumn)+DAY(f.DateColumn) NOT BETWEEN EndCheck + 1
                                                        AND StartCheck - 1 
1 голос
/ 08 февраля 2012
SELECT b_date FROM foos 
  WHERE DAYOFYEAR(b_date) BETWEEN 
    DAYOFYEAR('2011-01-07' - INTERVAL 10 DAY) AND (DAYOFYEAR('2011-01-07' - INTERVAL 10 DAY) + 21)
  OR DAYOFYEAR(b_date) BETWEEN 
    (DAYOFYEAR('2011-01-07' + INTERVAL 10 DAY) - 21) AND DAYOFYEAR('2011-01-07' + INTERVAL 10 DAY)
  GROUP BY foos.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...