mysql的date_format()函数格式月份的坑

问题背景

我表中有个字段存的是"年-月"格式的字符串,格式是这样的:'2023-08'

在查询这个表数据时,我使用了如下sql语句: select * from car where date_format(car_start_month,'%Y-%m')<='2023-08'

意思是查询 car_start_month字段的年月字符串<='2023-08'的数据,但是死活查不出来结果

解决方案

查询语句改为:select * from car where car_start_month<='2023-08' 后就能查出需要的数据了

原因分析

因为我car_start_month字段的存的是'2023-08'这样的字符串,而date_format()函数来转换这个字符串时会返回null,并不能正确的返回2023-08这样的结果。

date_format(字段名称,'时间格式')含税的2个参数,第一个参数的值必须是能够转为时间的格式,比如'2023-08-01'、'2023-08-01 12:01:45'这样的,如果不是能够转为时间的格式的内容,date_format会返回null,哪怕date_format的第二个参数设置的格式是'%Y-%m'这种格式要求。而我这边这种'2023-08',它在转换时会自动给2023-08后面添加-00,从而变成了2023-08-00,而这种明显不是正确的时间格式,就导致转化后返回了null。这样最终导致我上面的查询语句失败了,得不到想要的结果。

总结

凡是要用date_format()来格式化的字段,该字段的值如果是字符串,必须最短是年-月-日,比如'2023-08-25'这样的;存时间也可以,比如'2023-08-25 12:05:49';该字段的值不能存年-月,比如'2023-08';更不能存年,比如'2023'。

如果你的字段是存的'年-月'字符串,又想和传入的查询条件比较大小,那么直接用<或>或=来比较就可以了

相关推荐
NineData6 分钟前
NineData社区版抢先体验,获取无人机、双肩包、充电宝等周边福利
数据库
ramsey1729 分钟前
jmeter-AES加密
java·jmeter
QING61835 分钟前
一文带你搞懂HashSet和TreeSet的区别!!!
android·java·数据结构
用户62799471826237 分钟前
南大通用GBase 8c B兼容模式的加解密函数实践指南
数据库
QING61842 分钟前
详解:LinkedList的工作原理和实现
android·java·数据结构
QING61844 分钟前
详解:Set集合是如何保证元素不重复的
android·java·数据结构
Lill_bin44 分钟前
Java中的分布式锁:原理、实现与最佳实践
java·开发语言·数据结构·分布式·算法·排序算法·maven
kehua_gao1 小时前
JMeter 5.6.3 jdk 1.8 不能录制https网页脚本的解决办法
java·jmeter·https
qq_447663051 小时前
Spring学习之路:环境搭建、核心API与配置文件细节
java·后端·spring
tangweiguo030519871 小时前
Java 和 Kotlin 实现 23 种设计模式:从理论到实践
android·java·kotlin