mysql 根据日期段 生成对应列
第一种
建一个表,插入连续的时间,然后查询出对应表之间的数据
第二种 找个很大的表执行下面的语句,比如说我要查询2018-01-10到2018-01-20每天的数据,那么就可以写成
SELECT @cdate := DATE_ADD(@cdate, INTERVAL +1 DAY) cday
FROM( SELECT @cdate := DATE_ADD('2018-01-10', INTERVAL -1 DAY) FROM data_t limit 15) t0
WHERE date(@cdate) <= DATE_ADD('2018-01-20', INTERVAL -1 DAY)
注意:data_t 可以是任意表但是 表存在的表的数据必须大于日期之间的数据量
如果小于会显示日期会不全的
第三种 使用缓存表
创建一个存储过程,不同于以上的例子,这个可以直接在调用的时候给时间范围。对于日期范围需要和用户交互,需要灵活更改的,这个方法更加适用
DELIMITER $$ DROP PROCEDURE IF EXISTS create_calendar $$ CREATE PROCEDURE create_calendar (s_date DATE, e_date DATE) BEGIN SET @createSql = 'CREATE TABLE IF NOT EXISTS calendar ( `date` date NOT NULL, UNIQUE KEY `unique_date` (`date`) USING BTREE )ENGINE=InnoDB DEFAULT CHARSET=utf8'; prepare stmt from @createSql; execute stmt; WHILE s_date <= e_date DO INSERT IGNORE INTO calendar VALUES (DATE(s_date)) ; SET s_date = s_date + INTERVAL 1 DAY ; END WHILE ; END$$ DELIMITER ;
调用:
CALL create_calendar ('2018-03-01', '2018-12-30');
第四种:利用临时表和第三种方法结合
CREATE PROCEDURE create_calendar2 (s_date DATE, e_date DATE) BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_calendar; CREATE TEMPORARY TABLE tmp_calendar ( id INT AUTO_INCREMENT , weather_date date NULL, PRIMARY KEY (`id`) ); WHILE s_date <= e_date DO INSERT IGNORE INTO tmp_calendar VALUES (null,DATE(s_date)) ; SET s_date = s_date + INTERVAL 1 DAY ; END WHILE; select * from tmp_calendar; END
转自:https://blog.csdn.net/weixin_28952383/article/details/113171738

浙公网安备 33010602011771号