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

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