我正在尝试查询历史数据,我需要在1个月内返回数据:2周后和2周前进,但我需要一年无所谓。
所以,如果我今天要进行查询,我希望xxxx-06-31和xxxx-07-27之间的所有行date
提前感谢您的帮助!
编辑: 我尝试了两种方法。我认为这两者都不会在新的一年里发挥作用。一种是使用datepart(day),另一种是简单地将年份与日期进行比较并进行比较。
答案 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)
答案 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。