我有一张 table ,叫座谈会 table ,是这样的。
|----------------------------------------------------------------|
| id | symposium_date | topic | price |
|----------------------------------------------------------------|
| 1 | 2019-09-10 | Piano | 30.00 |
| 2 | 2019-09-09 | Flute | 20.00 |
| 3 | 2019-09-02 | Piano | 30.00 |
| 4 | 2019-08-26 | Flute | 20.00 |
| 5 | 2019-08-27 | Flute | 20.00 |
-----------------------------------------------------------------|
比如当我运行查询时,NOW() 返回当前日期时间,即。 2019-09-13 05:21:50。
我想要一个查询,它将向我返回从 NOW() 向后追溯的每 7 天间隔的开始和结束日期,每条记录都在该间隔内。为了更好地理解,检查我想要的这个返回集
|----------------------------------------------------------------|
| id | symposium_date | from-interval | to-interval |
|----------------------------------------------------------------|
| 1 | 2019-09-10 | 2019-09-07 | 2019-09-13 |
| 2 | 2019-09-09 | 2019-09-07 | 2019-09-13 |
| 3 | 2019-09-02 | 2019-08-31 | 2019-09-06 |
| 4 | 2019-08-26 | 2019-08-24 | 2019-09-30 |
| 5 | 2019-08-27 | 2019-08-24 | 2019-09-30 |
| ---------------------------------------------------------------|
我怎样才能做到这一点?
我当前的查询就像他的:-
SELECT id, symposium_date from FROM symposia
WHERE (
symposium_date >= ( NOW() + INTERVAL -7 DAY )
AND symposium_date <= NOW()
)
OR symposium_date < (NOW() + INTERVAL -7 DAY)
但是我怎样才能获取间隔范围呢?
最佳答案
注意:以下方法适用于需要所有间隔的情况。例如:您需要获取所有周范围,无论范围内是否存在 symposium_date
。如果您不需要所有间隔,则使用此答案:https://stackoverflow.com/a/57929123/2469308
现在,您需要“一周”(7 天间隔)的动态“开始日期”和“结束日期”,具体取决于非确定性 NOW()
函数。
一种方法是利用 number generator表在这里。您可以在数据库中定义一个永久表,用于存储 0 到 1000 之间的整数(比方说)。或者,您可以使用 Derived Table (为此查询具体化一个表)。为简洁起见,我最多考虑 3 个间隔;但是,您也可以增加以下查询中的数字:
(SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2) AS ngen
现在,我们可以使用一些数学方法从 CURRENT_DATE()
开始创建 7 天的间隔:
SELECT CURRENT_DATE() - INTERVAL (((ngen.digit+1)*7)-1) day AS from_interval,
CURRENT_DATE() - INTERVAL ((ngen.digit)*7) day AS to_interval
FROM (SELECT 0 AS digit
UNION ALL
SELECT 1
UNION ALL
SELECT 2) ngen;
| from_interval | to_interval |
| ------------- | ----------- |
| 2019-09-07 | 2019-09-13 |
| 2019-08-31 | 2019-09-06 |
| 2019-08-24 | 2019-08-30 |
现在,我们可以简单地使用上面的结果集作为 Derived Table和 JOIN
返回匹配 symposium_date
的 symposia
表 BETWEEN
from_interval
和 to_interval
的特定对:
模式(MySQL v5.7)
CREATE TABLE symposia
(`id` int, `symposium_date` date, `topic` varchar(5), `price` decimal(11,2))
;
INSERT INTO symposia
(`id`, `symposium_date`, `topic`, `price`)
VALUES
(1, '2019-09-10', 'Piano', 30.00),
(2, '2019-09-09', 'Flute', 20.00),
(3, '2019-09-02', 'Piano', 30.00),
(4, '2019-08-26', 'Flute', 20.00),
(5, '2019-08-27', 'Flute', 20.00)
;
查询
SELECT s.id,
s.symposium_date,
weeks.from_interval,
weeks.to_interval
FROM symposia s
JOIN (SELECT CURRENT_DATE() - INTERVAL (((ngen.digit+1)*7)-1) day AS
from_interval,
CURRENT_DATE() - INTERVAL ((ngen.digit)*7) day AS
to_interval
FROM (SELECT 0 AS digit
UNION ALL
SELECT 1
UNION ALL
SELECT 2) ngen) AS weeks
ON s.symposium_date BETWEEN weeks.from_interval AND weeks.to_interval;
结果
| id | symposium_date | from_interval | to_interval |
| --- | -------------- | ------------- | ----------- |
| 1 | 2019-09-10 | 2019-09-07 | 2019-09-13 |
| 2 | 2019-09-09 | 2019-09-07 | 2019-09-13 |
| 3 | 2019-09-02 | 2019-08-31 | 2019-09-06 |
| 4 | 2019-08-26 | 2019-08-24 | 2019-08-30 |
| 5 | 2019-08-27 | 2019-08-24 | 2019-08-30 |
关于mysql - 从现在开始每隔 7 天在 mysql 中选择数据和日期范围窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57917928/