我的foos表中有日期字段.所以现在我需要从日期间隔中选择所有foo,但仅比较月份和日期.
例如,我需要选择2012年1月7日之前和之后10天的所有foo- 12月28日-1月17日或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,date
来源: https://codeday.me/bug/20191201/2083552.html