问题:
有时我们在生成一些时间轴类似的数据时,要求数据库不管有没有指定天的数据,都要生成该时间节点,可用mysql.help_topic来解决此类问题,通过序列和日期函数相结合来满足我们的业务需求。
例如:查询2023-05-13与2023-07-13之间的所有日期。
#查询两个日期之间的所有日期
SELECT DATE_FORMAT( DATE_ADD(CONCAT('2023-05-13'), INTERVAL(help_topic_id) DAY),'%Y-%m-%d') DATA_DATE
FROM mysql.help_topic
WHERE help_topic_id <= TIMESTAMPDIFF(DAY,CONCAT('2023-05-13'),CONCAT('2023-07-13'))
ORDER BY DATA_DATE
可以利用 mysql.help_topic 系统表中的 help_topic_id 字段值。其中help_topic本身是Mysql一个帮助解释注释表,用于解释Mysql各种专有名词,由于这张表数据ID是从0顺序增加的,方便我们用于计数,但是有最大值,一旦超过这个数字,我们就需要己自定义一张表。
以上SQL执行情况如下:
另附其它日期处理的方法:
本周,本月,本季度,本年的第一天和最后一天
#查询本周第一天
SELECT DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE()) DAY) AS TIME
#查询本周的最后一天
SELECT DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE())-6 DAY) AS TIME
#查询本月的第一天
SELECT DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY) AS TIME
#查询本月的最后一天
SELECT LAST_DAY(CURDATE()) AS TIME
#当前quarter的第一天:
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-3 month),'%Y-%m-'),'01');
#当前quarter的最后一天:
select LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-1 month);
#当年第一天:
SELECT DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY);
#当年最后一天:
SELECT concat(YEAR(now()),'-12-31');
新增一个星期,一个月,一个季度,一年
#新增一个星期
SELECT DATE_ADD(now(), INTERVAL 1 week) time
#新增一个月
SELECT DATE_ADD(now(), INTERVAL 1 month) time
#新增一个季度
SELECT DATE_ADD(now(), INTERVAL 1 quarter) time
#新增一年
SELECT DATE_ADD(now(), INTERVAL 1 year) time