9

我正在尝试查询历史数据,我只需要返回 1 个月的数据:2 周前和 2 周前,但我需要年份无关紧要。

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

在此先感谢您的帮助!

编辑:我尝试了两种方法。我相信这两者都不会在新的一年左右奏效。一种是使用 datepart(day) ,另一种是简单地取消日期并进行比较。

4

3 回答 3

9

考虑这个问题的最好方法是将日期转换为 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 天内,那么您将错过应该包括在内的 Jan 中的一天。如果你关心这一点,那么你应该365[the number of days in the year - 1]替换。

于 2012-09-14T03:43:56.023 回答
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 演示

于 2012-09-14T02:11:41.640 回答
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 在没有闰日的年份处理 02-29(MySQL 将 NULL-ify),迫使它下降到 02-28。

于 2012-09-14T02:41:00.490 回答