我正在尝试查询历史数据,我只需要返回 1 个月的数据:2 周前和 2 周前,但我需要年份无关紧要。
所以,如果我今天要进行查询,我希望所有行都date
在 xxxx-06-31 和 xxxx-07-27 之间
在此先感谢您的帮助!
编辑:我尝试了两种方法。我相信这两者都不会在新的一年左右奏效。一种是使用 datepart(day) ,另一种是简单地取消日期并进行比较。
考虑这个问题的最好方法是将日期转换为 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
]替换。
假设你有这样的约会,
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)
如果解决方案非常慢,可以吗?
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。