我的 foos
表中有 date
字段。所以现在我需要从日期间隔中选择所有 foos 但只比较月份和日期。
例如,我需要选择 7 Jan 2012
-> 28 Dec - 17 Jan
前后 10 天的所有 foo。或 2009 年 7 月 10 日
前后一周 -> 7 月 3 日 - 7 月 17 日
。它应该仅根据所有年份的月份和日期进行选择。
我原始而幼稚的解决方案
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;
最佳答案
如果你想查找所有日期 2011 年 12 月 28 日
和 2012 年 1 月 17 日
,你可以使用这个:
WHERE DateColumn BETWEEN '2012-01-07' - INTERVAL 10 DAY
AND '2012-01-07' + INTERVAL 10 DAY
对于更普遍的问题,我看到了两种方法。一个易于编写,但对于大型 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
关于mysql - 仅按月和日比较日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9056019/