快来帮忙!只有 YYYY-MM 年月的时间怎么比较大小? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
manami
V2EX    MySQL

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

  •  
  •   manami 2021-04-27 09:47:48 +08:00 4966 次点击
    这是一个创建于 1702 天前的主题,其中的信息可能已经有所发展或是发生改变。

    遇到这种表设计,叔叔要生气了!/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 条附言    2021-04-27 11:55:21 +08:00
    刚试了字符串可以直接比较大小,我看看那个表为啥不行,不知道是不是代码写错了
    manami
        1
    manami  
    OP
       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
        2
    Reol  
       2021-04-27 09:57:06 +08:00   9
    看不懂 给你劈个叉吧
    qW7bo2FbzbC0
        3
    qW7bo2FbzbC0  
       2021-04-27 09:57:28 +08:00   1
    如果字段是 str,我建议加时间属性列(可以是硬加,然后写时间,也可以用虚拟列)实现。你这样直接比较走不了索引,效率不高
    zx4824
        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 的条目就可以了吧
    manami
        5
    manami  
    OP
       2021-04-27 09:58:57 +08:00
    @hjahgdthab750 是个历史遗留项目,表设计就很不合理,不管了……又不是不能用 / doge
    sexman
        6
    sexman  
       2021-04-27 10:00:28 +08:00   1
    replace('2021-04','-','') 比较字符串大小不就行了么
    anzu
        7
    anzu  
       2021-04-27 10:06:14 +08:00   1
    create_time 居然存的字符串?可以直接 create_time BETWEEN "2021-02" AND "2021-04" 吧
    manami
        8
    manami  
    OP
       2021-04-27 10:07:30 +08:00
    @anzu between 没法不包含后面那个月份,不行
    cornetCat
        9
    cornetCat  
       2021-04-27 10:07:39 +08:00   1
    楼主是妹子吧
    我上班逛 v2,其他同学看到只会吐槽我摸鱼,不会来帮我的。。。狗头
    manami
        10
    manami  
    OP
       2021-04-27 10:07:47 +08:00
    @anzu 没法包含,打错
    dqzcwxb
        11
    dqzcwxb  
       2021-04-27 10:14:20 +08:00   1
    数据库转换是没法用索引的,到后面性能巨差
    des
        12
    des  
       2021-04-27 10:16:09 +08:00   1
    用 IN 过滤可比你这快多了,一年也就 12 个月
    就算是查 10 年也才 120 个
    manami
        13
    manami  
    OP
       2021-04-27 10:28:12 +08:00
    @cornetCat “叔叔要生气了!”
    securityCoding
        14
    securityCoding  
       2021-04-27 10:35:01 +08:00   1
    走函数用不了索引哦
    wenzaiquan199
        15
    wenzaiquan199  
       2021-04-27 11:04:03 +08:00   1
    @cornetCat 年轻了,v 站上挂个可爱卡通妹子头像的基本上都是男娃娃
    mugglezzz
        16
    mugglezzz  
       2021-04-27 11:06:15 +08:00   1
    就算时间格式是字符串,不是也可以直接用 大于小于 比较吗? 月份是 01 呀
    Vegetable
        17
    Vegetable  
       2021-04-27 11:11:33 +08:00   1
    迷茫,直接字符串比较不行吗,搁这操作啥呢
    cheng6563
        18
    cheng6563  
       2021-04-27 11:13:25 +08:00   1
    直接字符串比较就行了,哪那么多事
    manami
        19
    manami  
    OP
       2021-04-27 11:14:07 +08:00
    @mugglezzz
    @Vegetable
    @cheng6563
    老哥们试试,我这里不行
    cheng6563
        20
    cheng6563  
       2021-04-27 11:23:52 +08:00
    @manami Mybatis 的日期参数也要用字符串,你是不是用了 Date 什么的。
    Jimmy1573
        21
    Jimmy1573  
       2021-04-27 11:37:49 +08:00   1
    @manami #13 女叔叔也是叔( doge
    zoharSoul
        22
    zoharSoul  
       2021-04-27 11:46:10 +08:00   1
    字符串可以直接比较的, 不要那样转换, 那样转换索引失效的.
    eric96
        23
    eric96  
       2021-04-27 11:49:06 +08:00   1
    timestamp 不是可以直接和字符串做比较吗,也一样能用到索引
    buster
        24
    buster  
       2021-04-27 14:45:02 +08:00   2
    where create_time between '2021-02' and '2021-04'
    TomVista
        25
    TomVista  
       2021-04-27 15:31:25 +08:00   1
    这样的同事请务必给我来一打
    boolstone
        26
    boolstone  
       2021-04-28 09:46:44 +08:00   1
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3178 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 10:59 PVG 18:59 LAX 02:59 JFK 05:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86