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

posted @ 2022-02-28 15:03  狼窝窝  阅读(527)  评论(0)    收藏  举报