Mysql
MySQL:有沒有辦法根據日期動態生成多個日期範圍
我得到的數據是
我想要的結果是
有沒有辦法從數據中的日期列生成這些日期(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`;
當然還有其他方法可以實現同樣的目標,但這將在緊要關頭完成。但是,如果您要對數百萬條記錄執行這種查詢,您將希望以非常不同的方式解決問題。