mysql - 仅按月和日比较日期

标签 mysql date

我的 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/

相关文章:

mysql - 日期格式 .NET 到 mysql

Mysql 查询显示的日期结果有点困惑

php - 我怎样才能在 php 中获取上个月的名称

python - 无效的日期解析器

c++ - setDateTimeFormat 增加一个小时

c# - MySQL 与 MonoTouch

java - 我可以通过单击java中第一帧中的按钮将记录插入到第二帧中吗? ( Swing )

MySQL:对按时间戳排序的大表进行非常慢的查询(尽管有索引)......

mysql - 通过 shell 脚本使用 Ubuntu 终端将 CSV 插入 MySQL

java - 将日期或日历类型转换为字符串格式