Mysql

MySQL:有沒有辦法根據日期動態生成多個日期範圍

  • November 28, 2021

我得到的數據是

我想要的結果是

有沒有辦法從數據中的日期列生成這些日期(from_date,to_date)?

我需要從日期的迭代中使用循環嗎?

我還能想到什麼來接近結果?

提前致謝

有沒有辦法生成這些日期(from_date,to_date)

“三角連接”:

SELECT a.date AS from_date,
      z.date AS to_date
   FROM t AS a
   CROSS JOIN t AS z
   WHERE a.date < z.date

然後可以再次加入t以處理總和。

假設一個簡單的表結構是這樣的:

CREATE TABLE IF NOT EXISTS `Sample` (
   `id`            int(11)        UNSIGNED   NOT NULL    AUTO_INCREMENT,
   `date`          timestamp                 NOT NULL    ,
   `cnt`           int(11)        UNSIGNED   NOT NULL    DEFAULT 1,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

使用這樣的數據:

INSERT INTO `Sample` (`date`)
VALUES ('2021-11-26'),
      ('2021-11-25'),
      ('2021-11-24'),
      ('2021-11-23');

你可以這樣做:

SELECT tmp.`id`,
      DATE_FORMAT(tmp.`from_dts`, '%Y-%m-%d') as `from_date`,
      DATE_FORMAT(tmp.`to_dts`, '%Y-%m-%d') as `to_date`,
      SUM(sm.`cnt`) as `cnt`
 FROM `Sample` sm INNER JOIN (SELECT a.`id`, DATE_FORMAT(a.`date`, '%Y-%m-%d 00:00:00') as `from_dts`, DATE_FORMAT(z.`date`, '%Y-%m-%d 23:59:59') as `to_dts`
                                FROM `Sample` a INNER JOIN `Sample` z ON a.`date` < z.`date`) tmp ON sm.`date` BETWEEN tmp.`from_dts` AND tmp.`to_dts`
GROUP BY tmp.`id`, `from_date`, `to_date`
ORDER BY `from_date`, `to_date`;

當然還有其他方法可以實現同樣的目標,但這將在緊要關頭完成。但是,如果您要對數百萬條記錄執行這種查詢,您將希望以非常不同的方式解決問題。

引用自:https://dba.stackexchange.com/questions/303147