mysql - 从现在开始每隔 7 天在 mysql 中选择数据和日期范围窗口

标签 mysql

我有一张 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 TableJOIN 返回匹配 symposium_datesymposiaBETWEEN from_intervalto_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  |

View on DB Fiddle

关于mysql - 从现在开始每隔 7 天在 mysql 中选择数据和日期范围窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57917928/

相关文章:

mysql - 使用临时表的问题

mysql - 从组中选择最旧的两条记录

php - 在 PHP 中使变量成为全局变量?

mysql - 将数据从一列插入到另一列的末尾,不包括插入的部分

php - csv 文件未插入 mysql 数据库

mysql group byyear() 的时间戳和foreign_id按时间戳排序

MySQL 查询没有返回正确的结果

mysql - 对具有 3 亿行和每秒 50-100 个查询的 MySQL innoDB 表的查询随机减慢

Mysql 添加别名,有并发症

PHP/MySQL 字符串搜索查询