Mysql 仅按月份和日期比较日期
我在我的Mysql 仅按月份和日期比较日期,mysql,date,Mysql,Date,我在我的foos表中得到了date字段。所以现在我需要从日期间隔中选择所有的foo,但只比较月份和日期 例如,我需要在2012年1月7日之前和之后的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 D
foos
表中得到了date
字段。所以现在我需要从日期间隔中选择所有的foo,但只比较月份和日期
例如,我需要在2012年1月7日之前和之后的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
在第一个示例中,是否希望日期介于2011年12月28日和2012年1月17日之间?或任何年份的日期,介于12月28日至1月17日之间,应独立于年份。因此,在任何一年中,它应该大于或等于12月28日,小于或等于1月17日。因此,1995年12月31日和1940年1月10日将符合我的需要。我认为你的答案很好,你可以把它作为答案发布。(有一张大桌子不会很快,但我想这不是一个问题。你觉得我的解决方案怎么样?它看起来很短,短得多。而且可能更容易理解它的作用:)但是
-20
和+20
应该有21
。
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;