MySQL 超出月份最大日期(工作总结)

前几天帮同事修改了一个bug,这个bug是怎么造成的呢。先来看需求,系统需要统计某个月份的数据。很简单的一个需求。 

同事的写的MySQL语句

SELECT
        REPLACE(FORMAT(sum(count_value),2), ',', '') as value,
        <if test="type == 'day'">
            count_date as `time`
        </if>
        <if test="type == 'hour'">
            count_time as `time`
        </if>
        <if test="type == 'month'">
            DATE_FORMAT(count_date, '%Y-%m') as `time`
        </if>
        <if test="type == 'year'">
            DATE_FORMAT(count_date, '%Y') as `time`
        </if>
        FROM
        device_value
        WHERE  count_date BETWEEN #{startTime} AND #{endTime}
        and node_id in
        <foreach collection="nodeIds" separator="," open="(" close=")" item="nodeId">
            #{nodeId}
        </foreach>
        GROUP BY
        <if test="type == 'day'">
             count_date
        </if>
        <if test="type == 'hour'">
            count_time
        </if>
        <if test="type == 'month'">
            DATE_FORMAT(count_date, '%Y-%m')
        </if>
        <if test="type == 'year'">
             DATE_FORMAT(count_date, '%Y')
        </if>
        <if test="type == 'day'">
            order by  count_date
        </if>
        <if test="type == 'hour'">
            order by  count_time
        </if>
        <if test="type == 'month'">
            order by  DATE_FORMAT(count_date, '%Y-%m')
        </if>

sql也很简单,就是通过传递不同的type从时间的不同角度去统计出device_value这张表中的在startTime和endTime这时间段内的value值之和。

然后就是Java代码了,具体就不展示了。总结来说他如果要查询六月的数据,他就是将前端传递过来的2024-06这样一个字符串拼接上一个01和31。然后就传递到xml中查询。运行时MySQL代码:

SELECT REPLACE
	( FORMAT( sum( count_value ), 2 ), ',', '' ) AS VALUE,
	count_date AS `time` 
FROM
	device_everyday_count_value 
WHERE
	count_date BETWEEN '2024-06-01' AND '2024-06-31'
	AND node_id IN ( 'KTXTYCNH' ) 
GROUP BY
	count_date 
ORDER BY
	count_date

看一下查询结果

                        

你会发现是没有结果的,实际上6月是有数据的,但是6月确实没有31号的只有30号,我将他写的31改为30后再此运行同样MySQL代码结果如下

                                

讲到这里大家应该也发现了代码问题之处了,就是日常超出了范围导致的查询没有结果。在前端展示的时候并不会报错,只是小于31天的数据是没有值的。

最后我将他的Java代码在传递日期的时候给修改了,通过LocalTime来获取某一年的某一月的日期的开始以及结束日期。

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate startTime = LocalDate.parse(date, formatter);
        String endDate = date;
        if("month".equals(dateType)){
            date = startTime.with(TemporalAdjusters.firstDayOfMonth()).toString();
            endDate = startTime.with(TemporalAdjusters.lastDayOfMonth()).toString();
        }else if("year".equals(dateType)){

            date = startTime.with(TemporalAdjusters.firstDayOfYear()).toString();
            endDate = startTime.with(TemporalAdjusters.lastDayOfYear()).toString();
        }
        事后我有问过他,我问他当时怎么想的,为什么会当时会这样写代码呢?
他跟我说:我写的时候觉得没什么不对啊,我当时觉得每个月的月份开始日期都是01,然后结束最大就是31我拼接出来的日期就算是6月只有30天但是我31也没什么问题也包含了30号的日期,并不会遗漏数据所以就这么写了。
然后我又问他:你当时写的时候没去测一下这种写法在特殊的月份的时候查询会不会出现问题呢。
他说:我没有,我当时写来并没有调用接口的时候并没有报错,并且有数据我就没管了。
他当时写的时候是5月份所以并不会有什么问题。至此我也不好再多说什么

 我只能说善用现有的工具,别写魔法数字和魔法字符串。

路漫漫其修远兮,吾将上下而求索!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/735938.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

068、PyCharm 关于Live Template模板

在 PyCharm 编辑器中&#xff0c;Live Templates 是一种功能强大的工具&#xff0c;可以帮助我们快速插入常用的代码片段或模板。 以下是在 PyCharm 中添加 Live Templates 的步骤&#xff1a; 添加 Live Templates 步骤&#xff1a; 打开 PyCharm 编辑器。 转到菜单栏中的 …

分布式,容错:10台电脑坏了2台

由10台电脑组成的分布式系统&#xff0c;随机、任意坏了2台&#xff0c;剩下的8台电脑仍然储存着全部信息&#xff0c;可以继续服务。这是怎么做到的&#xff1f; 设N台电脑&#xff0c;坏了H台&#xff0c;要保证上述性质&#xff0c;需要有冗余&#xff0c;总的存储量降低为…

三、MyBatis实践:提高持久层数据处理效率

三、MyBatis实践&#xff1a;提高持久层数据处理效率 目录 一、Mybatis简介 1.1 简介1.2 持久层框架对比1.3 快速入门&#xff08;基于Mybatis3方式&#xff09; 二、MyBatis基本使用 2.1 向SQL语句传参 2.1.1 mybatis日志输出配置2.1.2 #{}形式2.1.3 ${}形式 2.2 数据输入 2…

redis主从复制、哨兵、集群

在实际的生活环境中&#xff0c;如果只使用一个redis进行读写操作&#xff0c;那么面对庞大的访问人群是崩溃的&#xff0c;所以可以有几个redis&#xff0c;一个用来做主机&#xff0c;提供修改数据操作&#xff0c;而这个主机用来控制其他redis&#xff0c;即将更新的发送&am…

【七】【QT开发应用】跨UI发送信号,跨线程发送信号

跨UI发送信号 基本框架 新建窗口 自定义信号 跨线程发送信号 新建线程 查看线程号 完整代码 跨UI发送信号 setdialog.h #ifndef SETDIALOG_H #define SETDIALOG_H#include <QDialog>namespace Ui { class setdialog; }class setdialog : public QDialog {Q_OBJECTpub…

【Python】已解决:ModuleNotFoundError: No module named ‘paddle’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ModuleNotFoundError: No module named ‘paddle’ 一、分析问题背景 在Python编程中&#xff0c;ModuleNotFoundError是一个常见的错误&#xff0c;它通常发生…

C语言的数据结构:树与二叉树(树篇)

前言 之前所学到的数据结构都是线性结构特征&#xff0c;所谓线性就是在结构上&#xff0c;将节点连接起来时&#xff0c;像一条线一样。如链表则是上一个节点包含下一个节点地址的指针&#xff0c;这样依次下去。而串、队列、栈则实现方式都依赖于链表或顺序表而实现&#xf…

Inception_V2_V3

Inception_V2_V3 CNN卷积网络的发展史 1. LetNet5(1998) 2. AlexNet(2012) 3. ZFNet(2013) 4. VGGNet(2014) 5. GoogLeNet(2014) 6. ResNet(2015) 7. DenseNet(2017) 8. EfficientNet(2019) 9. Vision Transformers(2020) 10. 自适应卷积网络(2021) 上面列出了发展到现在CNN的…

智能优化算法改进策略之局部搜索算子(三)—二次插值法

1、原理介绍 多项式是逼近函数的一种常用工具。在寻求函数极小点的区间&#xff08;即寻查区间&#xff09;上&#xff0c;我们可以利用在若干点处的函数值来构成低次插值多项式&#xff0c;用它作为求极小点的函数的近似表达式&#xff0c;并用这个多项式的极小点作为原函数极…

示例:推荐一个基于第三方开源控件库DataGridFilter封装的FilterColumnDataGrid,可以像Excel拥有列头筛选器

一、目的&#xff1a;基于第三方开源控件库DataGridFilter封装的FilterColumnDataGrid&#xff0c;可以像Excel拥有列头筛选器&#xff0c;感兴趣的可以去下方链接地址查看开源控件库地址。本控件封装的目的在于将第三方库的皮肤和样式封装到皮肤库中可统一设置样式&#xff0c…

Day 31:100334. 包含所有1的最小矩形面积Ⅰ

Leetcode 100334. 包含所有1的最小矩形面积Ⅰ 给你一个二维 **二进制 **数组 grid。请你找出一个边在水平方向和竖直方向上、面积 最小 的矩形&#xff0c;并且满足 grid 中所有的 1 都在矩形的内部。 返回这个矩形可能的 **最小 **面积。 确定首次出现 1 的第一行 top&#xf…

转让神州开头的无区域科技公司需要多少钱

您好&#xff0c;我公司现有2家无区域神州名称的公司转让。所谓无区域名称是公司名称中不带有行政区划、及行业特点的公司名称&#xff0c;都是需要在工商总,局核准名称的&#xff0c;对于民营企业来说也比较喜欢这种名称名称很大气&#xff0c;现在重核更严格了&#xff0c;所…

报错:mAP数据为0%+无法读取output里的图片红色警告

debug检查&#xff1a;发现创建的output和input的路径不在同一级 操作1&#xff1a;修改output创建路径为绝对路径后&#xff0c;output和input文件成功在同一级&#xff0c;但问题仍存在 debug检测&#xff1a;识别的类别和保存的类别不同&#xff0c;没有保存数据 操作2&…

WMS项目测试点

这里写目录标题 最后附有图片 仓库系统 仓库 / 库区 仓库 新增仓库 编号 必填校验 字段长度校验 20为字符 数据类型校验 名称 必填校验 字段长度校验 20为字符 数据类型校验 备注 填写备注校验 字符长度限制 不填写备注校验 新增仓库之后是否可以通过查询仓库名称和仓库编号查询…

linux系统cpu飙高如何排查

1.通过top命令查看cpu占比较高的进程ID 2.通过top -H -p <进程ID>命令查看该进程中具体线程&#xff0c;可以看到第一个线程 4311 占用了88.2%的cpu 3.通过 printf "%x\n" <线程ID> 把10进制的线程id转为16进制 4.通过jstack <进程ID> | grep &…

体检项目里的中文名称和英文简称

在做驾驶员体检、健康证等体检时&#xff0c;会看到不同的体检项目名称&#xff0c;比如有身高、体重、眼睛视力、耳鼻喉、肝功能、心电图等。     在体检之前的一周&#xff0c;要注意休息好、清淡饮食。晚上10点之前入睡&#xff0c;不要熬夜。贝壳类食物&#xff0c;比如花…

本地离线模型搭建指南-RAG架构实现

搭建一个本地中文大语言模型&#xff08;LLM&#xff09;涉及多个关键步骤&#xff0c;从选择模型底座&#xff0c;到运行机器和框架&#xff0c;再到具体的架构实现和训练方式。以下是一个详细的指南&#xff0c;帮助你从零开始构建和运行一个中文大语言模型。 本地离线模型搭…

云手机在跨平台兼容性方面优势明显?有何应用场景

跨平台设备间无缝切换和数据同步的需求现在是很多人或者企业都需要的&#xff0c;云手机在这些方面似乎有很大优势&#xff1f;下面我们来具体探讨在兼容方面&#xff0c;云手机有何出彩之处&#xff1f;又支持哪些应用场景呢 先来说说云手机跨平台兼容性优势所在&#xff0c;要…

动态规划——活动安排问题II(C++)

Take it easy! 2024年6月19日 题目描述 假设有n个活动和一个资源&#xff0c;每个活动执行时都需要占用该资源&#xff0c;并且该资源在任何时间只能被一个活动所占用&#xff0c;一旦某个活动开始执行&#xff0c;中间将不能被打断&#xff0c;直到其执行完毕。每个活动i都有…

WordPress主题仿虎嗅网/雷锋网自媒体主题(两套打包)

主题介绍 这两款wordpress主题是精仿虎嗅网和雷锋网的&#xff0c;这两款主题应该是没有多大BUG&#xff0c;同时这两款主题目前跟现在的虎嗅、雷锋两个网站看上去并没有多大区别&#xff0c;唯一美中不足的就是不支持PHP7.0以上。经常逛虎嗅网与雷锋网的同志应该是喜欢这两款…