快来帮忙!只有 YYYY-MM 年月的时间怎么比较大小?

2021-04-27 09:47:48 +08:00
 manami

遇到这种表设计,叔叔要生气了!/doge

有个表 aaa 的时间字段前同事只存了 YYYY-MM,比如 2021-01 这种格式

ID money create_time
1 xxx 2021-01
2 xxx 2021-02
3 xxx 2021-03
4 xxx 2021-04

现在有个需求是前端传开始月份和结束月份来过滤记录。比如传 beginMonth 为 2021-02 、endMonth 为 2021-04 进来要得到 2 月、3 月和 4 月的数据

数据库用的是 MySQL,ORM 框架用的是 Mybatis

我试了几种方式都不成功,比如这样

beginMonth 和 endMonth 转成了日期传进来

SELECT
    *
FROM
    aaa
WHERE
    create_time >= #{beginMonth} 
AND
    create_time <= #{endMonth}

又比如这样

begMonth 和 endMonth 字符串的形式传进来

SELECT
    *
FROM
    aaa
WHERE
    DATE_FORMAT(create_time , '%Y-%m') >= #{beginMonth}
AND
    DATE_FORMAT(create_time , '%Y-%m') <= #{endMonth}

都没法得到正确的返回。求助……

Thanks in advance !

4424 次点击
所在节点    MySQL
26 条回复
manami
2021-04-27 09:55:46 +08:00
问题解决了……同事看到我在逛 v2ex,就问我有什么事,我跟他说了问题然后一两分钟后他就扔给我一个 sql,已经好了

beginMonth 和 endMonth 转成了日期传进来
````
SELECT
*
FROM
aaa
WHERE
STR_TO_DATE(CONCAT(create_time,'-01'),'%Y-%m-%d') >= #{beginMonth}
AND
STR_TO_DATE(CONCAT(create_time,'-01'),'%Y-%m-%d') <= #{endMonth}
````
Reol
2021-04-27 09:57:06 +08:00
看不懂 给你劈个叉吧
qW7bo2FbzbC0
2021-04-27 09:57:28 +08:00
如果字段是 str,我建议加时间属性列(可以是硬加,然后写时间,也可以用虚拟列)实现。你这样直接比较走不了索引,效率不高
zx4824
2021-04-27 09:58:54 +08:00
例:
前端调取 2021-01 到 2021-06 的数据

写个函数,穷举这六个月‘2021-01 、2021-02 、2021-03 、2021-04 、2021-05 、2021-06’设为数组 a

数据库筛选,包含数组 a 的条目就可以了吧
manami
2021-04-27 09:58:57 +08:00
@hjahgdthab750 是个历史遗留项目,表设计就很不合理,不管了……又不是不能用 / doge
sexman
2021-04-27 10:00:28 +08:00
replace('2021-04','-','') 比较字符串大小不就行了么
anzu
2021-04-27 10:06:14 +08:00
create_time 居然存的字符串?可以直接 create_time BETWEEN "2021-02" AND "2021-04" 吧
manami
2021-04-27 10:07:30 +08:00
@anzu between 没法不包含后面那个月份,不行
cornetCat
2021-04-27 10:07:39 +08:00
楼主是妹子吧
我上班逛 v2,其他同学看到只会吐槽我摸鱼,不会来帮我的。。。狗头
manami
2021-04-27 10:07:47 +08:00
@anzu 没法包含,打错
dqzcwxb
2021-04-27 10:14:20 +08:00
数据库转换是没法用索引的,到后面性能巨差
des
2021-04-27 10:16:09 +08:00
用 IN 过滤可比你这快多了,一年也就 12 个月
就算是查 10 年也才 120 个
manami
2021-04-27 10:28:12 +08:00
@cornetCat “叔叔要生气了!”
securityCoding
2021-04-27 10:35:01 +08:00
走函数用不了索引哦
wenzaiquan199
2021-04-27 11:04:03 +08:00
@cornetCat 年轻了,v 站上挂个可爱卡通妹子头像的基本上都是男娃娃
mugglezzz
2021-04-27 11:06:15 +08:00
就算时间格式是字符串,不是也可以直接用 大于小于 比较吗? 月份是 01 呀
Vegetable
2021-04-27 11:11:33 +08:00
迷茫,直接字符串比较不行吗,搁这操作啥呢
cheng6563
2021-04-27 11:13:25 +08:00
直接字符串比较就行了,哪那么多事
manami
2021-04-27 11:14:07 +08:00
@mugglezzz
@Vegetable
@cheng6563
老哥们试试,我这里不行
cheng6563
2021-04-27 11:23:52 +08:00
@manami Mybatis 的日期参数也要用字符串,你是不是用了 Date 什么的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/773526

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX