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 · 4203 次点击
    这是一个创建于 1111 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    遇到这种表设计,叔叔要生气了!/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   ·   实用小工具   ·   910 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:12 · PVG 05:12 · LAX 14:12 · JFK 17:12
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com