
遇到这种表设计,叔叔要生气了!/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 !
1 manami OP 问题解决了……同事看到我在逛 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} ```` |
2 Reol 2021-04-27 09:57:06 +08:00 看不懂 给你劈个叉吧 |
3 qW7bo2FbzbC0 2021-04-27 09:57:28 +08:00 如果字段是 str,我建议加时间属性列(可以是硬加,然后写时间,也可以用虚拟列)实现。你这样直接比较走不了索引,效率不高 |
4 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 的条目就可以了吧 |
5 manami OP @hjahgdthab750 是个历史遗留项目,表设计就很不合理,不管了……又不是不能用 / doge |
6 sexman 2021-04-27 10:00:28 +08:00 replace('2021-04','-','') 比较字符串大小不就行了么 |
7 anzu 2021-04-27 10:06:14 +08:00 create_time 居然存的字符串?可以直接 create_time BETWEEN "2021-02" AND "2021-04" 吧 |
9 cornetCat 2021-04-27 10:07:39 +08:00 楼主是妹子吧 我上班逛 v2,其他同学看到只会吐槽我摸鱼,不会来帮我的。。。狗头 |
11 dqzcwxb 2021-04-27 10:14:20 +08:00 数据库转换是没法用索引的,到后面性能巨差 |
12 des 2021-04-27 10:16:09 +08:00 用 IN 过滤可比你这快多了,一年也就 12 个月 就算是查 10 年也才 120 个 |
14 securityCoding 2021-04-27 10:35:01 +08:00 走函数用不了索引哦 |
15 wenzaiquan199 2021-04-27 11:04:03 +08:00 @cornetCat 年轻了,v 站上挂个可爱卡通妹子头像的基本上都是男娃娃 |
16 mugglezzz 2021-04-27 11:06:15 +08:00 就算时间格式是字符串,不是也可以直接用 大于小于 比较吗? 月份是 01 呀 |
17 Vegetable 2021-04-27 11:11:33 +08:00 迷茫,直接字符串比较不行吗,搁这操作啥呢 |
18 cheng6563 2021-04-27 11:13:25 +08:00 直接字符串比较就行了,哪那么多事 |
22 zoharSoul 2021-04-27 11:46:10 +08:00 字符串可以直接比较的, 不要那样转换, 那样转换索引失效的. |
23 eric96 2021-04-27 11:49:06 +08:00 timestamp 不是可以直接和字符串做比较吗,也一样能用到索引 |
24 buster 2021-04-27 14:45:02 +08:00 where create_time between '2021-02' and '2021-04' |
25 TomVista 2021-04-27 15:31:25 +08:00 这样的同事请务必给我来一打 |
26 boolstone 2021-04-28 09:46:44 +08:00 |