SQL:两个日期之间没有年份?

时间:2012-09-14 01:39:27

标签: mysql sql

我正在尝试查询历史数据,我需要在1个月内返回数据:2周后和2周前进,但我需要一年无所谓。

所以,如果我今天要进行查询,我希望xxxx-06-31和xxxx-07-27之间的所有行date

提前感谢您的帮助!

编辑: 我尝试了两种方法。我认为这两者都不会在新的一年里发挥作用。一种是使用datepart(day),另一种是简单地将年份与日期进行比较并进行比较。

3 个答案:

答案 0 :(得分:8)

考虑此问题的最佳方法是将日期转换为0到365之间的数字,对应于一年中的某一天。然后只需选择这个差异小于14的日期就可以得到你的两周窗口。

这将在年初或年底崩溃。但简单的模运算可以给出答案。

幸运的是,MySQL有DAYOFYEAR(date),所以它并不复杂:

SELECT * FROM tbl t
WHERE 
  MOD(DAYOFYEAR(currdate) - DAYOFYEAR(t.the_date) + 365, 365) <= 14
  OR MOD(DAYOFYEAR(t.the_date) - DAYOFYEAR(currdate) + 365, 365) <= 14

需要额外的+ 365,因为MySQL的MOD将返回负数。

这个答案没有正确说明闰年。如果当前年份不是闰年而且该年度是在年底的14天内,那么您将错过1月份的一天,您应该包括在内。如果您关心这一点,那么您应该将365替换为[the number of days in the year - 1]。

答案 1 :(得分:7)

假设您有这样的日期,

create table datelist
(
  d date
);

insert into datelist values
('2012-07-01'),
('2011-06-29'),
('2012-07-02'),
('2010-07-05'),
('2012-05-31'),
('2010-06-30');

尝试以下查询

SELECT d, date_format(d,'%Y-%b-%d')
FROM datelist
WHERE (MONTH(d) = 6 AND DAYOFMONTH(d) >= 30)
   OR (MONTH(d) = 7 AND DAYOFMONTH(d) <= 27)

SQLFiddle Demo

答案 2 :(得分:2)

如果解决方案非常慢,可以吗?

    SELECT tbl.*
      FROM tbl
INNER JOIN (SELECT COALESCE(DATE(CONCAT(yyyy, '-', MONTH(CURRENT_DATE), '-', DAYOFMONTH(CURRENT_DATE)),
                            DATE(CONCAT(yyyy, '-02-28'))) AS midpoint
              FROM (SELECT DISTINCT(YEAR(d)) AS yyyy
                     FROM tbl) all_years) adjusted
           ON tbl.datecol BETWEEN adjusted.midpoint - INTERVAL 2 WEEK
                                  AND
                                  adjusted.midpoint + INTERVAL 2 WEEK;

计算数据集中所有年份的所有中点,然后从处理年终包装的任何此类中点开始记录+ - 2周。

COALESCE在没有leapday的情况下处理02-29(MySQL将为NULL-ify),将其强制降至02-28。