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