Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 仅按月份和日期比较日期_Mysql_Date - Fatal编程技术网

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;