网站首页 > 基础教程 正文
今天在头条看到作者“一缕82年的清风”发的一文章,文章标题是“MySQL统计近30天的数据,无数据的填充0”。虽然这个问题一般为了减少数据库的计算压力都会在业务代码上来处理。而不会让数据库来实现。但自己瞬间对这个问题感兴趣想研究看下还有没有别的解决办法来自动填充日期。
根据作者写的自动填充日期的SQL语句执行结果。分析思考还真想出两个解决办法供大家参考。
1、作者的SQL语句
SELECT
@s := @s + 1 AS indexs, DATE_FORMAT(DATE(DATE_SUB(CURRENT_DATE, INTERVAL @s DAY)), '%Y-%m-%d') AS dates
FROM
mysql.help_topic,
(SELECT @s := -1) temp
WHERE
@s < 30
ORDER BY dates
LIMIT 30;
执行结果:
+--------+------------+
| indexs | dates |
+--------+------------+
| 30 | 2022-02-28 |
| 29 | 2022-03-01 |
| 28 | 2022-03-02 |
| 27 | 2022-03-03 |
| 26 | 2022-03-04 |
| 25 | 2022-03-05 |
| 24 | 2022-03-06 |
| 23 | 2022-03-07 |
| 22 | 2022-03-08 |
| 21 | 2022-03-09 |
| 20 | 2022-03-10 |
| 19 | 2022-03-11 |
| 18 | 2022-03-12 |
| 17 | 2022-03-13 |
| 16 | 2022-03-14 |
| 15 | 2022-03-15 |
| 14 | 2022-03-16 |
| 13 | 2022-03-17 |
| 12 | 2022-03-18 |
| 11 | 2022-03-19 |
| 10 | 2022-03-20 |
| 9 | 2022-03-21 |
| 8 | 2022-03-22 |
| 7 | 2022-03-23 |
| 6 | 2022-03-24 |
| 5 | 2022-03-25 |
| 4 | 2022-03-26 |
| 3 | 2022-03-27 |
| 2 | 2022-03-28 |
| 1 | 2022-03-29 |
+--------+------------+
30 rows in set (0.00 sec)
2、新的解决办法1
SELECT
DATE(NOW()) + INTERVAL -t1.help_topic_id DAY
FROM
mysql.help_topic t1
WHERE
t1.help_topic_id > 0
ORDER BY help_topic_id ASC
LIMIT 30;
执行结果:
+----------------------------------------------+
| DATE(NOW()) + INTERVAL -t1.help_topic_id DAY |
+----------------------------------------------+
| 2022-03-29 |
| 2022-03-28 |
| 2022-03-27 |
| 2022-03-26 |
| 2022-03-25 |
| 2022-03-24 |
| 2022-03-23 |
| 2022-03-22 |
| 2022-03-21 |
| 2022-03-20 |
| 2022-03-19 |
| 2022-03-18 |
| 2022-03-17 |
| 2022-03-16 |
| 2022-03-15 |
| 2022-03-14 |
| 2022-03-13 |
| 2022-03-12 |
| 2022-03-11 |
| 2022-03-10 |
| 2022-03-09 |
| 2022-03-08 |
| 2022-03-07 |
| 2022-03-06 |
| 2022-03-05 |
| 2022-03-04 |
| 2022-03-03 |
| 2022-03-02 |
| 2022-03-01 |
| 2022-02-28 |
+----------------------------------------------+
30 rows in set (0.00 sec)
3、新的解决办法2
SELECT
DATE(NOW()) + INTERVAL -(t1.value + t2.value + t4.value + t8.value + t16.value) DAY AS dates
FROM
(SELECT 0 AS value UNION ALL SELECT 1 value) t1
CROSS JOIN (SELECT 0 AS value UNION ALL SELECT 2 value) t2
CROSS JOIN (SELECT 0 AS value UNION ALL SELECT 4 value) t4
CROSS JOIN (SELECT 0 AS value UNION ALL SELECT 8 value) t8
CROSS JOIN (SELECT 0 AS value UNION ALL SELECT 16 value) t16
WHERE
t1.value + t2.value + t4.value + t8.value + t16.value > 0;
执行结果:
+------------+
| dates |
+------------+
| 2022-03-29 |
| 2022-03-28 |
| 2022-03-27 |
| 2022-03-26 |
| 2022-03-25 |
| 2022-03-24 |
| 2022-03-23 |
| 2022-03-22 |
| 2022-03-21 |
| 2022-03-20 |
| 2022-03-19 |
| 2022-03-18 |
| 2022-03-17 |
| 2022-03-16 |
| 2022-03-15 |
| 2022-03-14 |
| 2022-03-13 |
| 2022-03-12 |
| 2022-03-11 |
| 2022-03-10 |
| 2022-03-09 |
| 2022-03-08 |
| 2022-03-07 |
| 2022-03-06 |
| 2022-03-05 |
| 2022-03-04 |
| 2022-03-03 |
| 2022-03-02 |
| 2022-03-01 |
| 2022-02-28 |
| 2022-02-27 |
+------------+
31 rows in set (0.00 sec)
4、解决办法分析
- 作者SQL语句:利用MYSQL帮助表的记录+数字变量实现填充日期。
- 新解决办法1:根据作者SQL语句分析结合MYSQL帮助表字段help_topic_id自增有序值填充日期。减少了数字变量。
- 新解决办法2:考虑新解决办法1如果MYSQL帮助表字段help_topic_id不是自增有序值的话执行的数据结果就是bug。所以取掉查询实体表利用MySQL的交叉关联方式生成0~31个数字填充日期。
5、总结
- 个人推荐使用新解决办法2实现填充日期。SQL语句无任何表依赖。
感谢大家的评论、点赞、分享、关注。。。
猜你喜欢
- 2024-11-07 VBA编程,利用DatePart函数获取特定日期
- 2024-11-07 MySQL引起的CPU消耗过大,你会如何优化?
- 2024-11-07 高级数据分析师必备SQL常用处理函数,我觉得收藏是必须的
- 2024-11-07 每日SQL自学知识点(第三天)—lead的窗口函数、datediff函数
- 2024-11-07 mysql与时间有关的查询 mysql与时间有关的查询方法
- 2024-11-07 面试官:如何正确的清理Mysql数据库binlog日志?
- 2024-11-07 数据库丨从MySQL数值隐式转换成了double型的测试点,值得学习
- 2024-11-07 限定Excel数据使用时间,到期自动销毁,这2种方法都能轻松搞定
- 2024-11-07 关于Mysql数据库清理binlog日志命令总结
- 2024-11-07 「MySQL入门」快来看看MySQL函数就是这么简单
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)