› 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 · Apr 27, 2021 · 5538 views
    This topic created in 1983 days ago, the information mentioned may be changed or developed.

    遇到这种表设计,叔叔要生气了!/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 !

    Supplement 1  ·  Apr 27, 2021
    刚试了字符串可以直接比较大小,我看看那个表为啥不行,不知道是不是代码写错了
    manami
        1
    manami  
    OP
       Apr 27, 2021
    问题解决了……同事看到我在逛 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  
       Apr 27, 2021   ❤️ 9
    看不懂 给你劈个叉吧
    qW7bo2FbzbC0
        3
    qW7bo2FbzbC0  
       Apr 27, 2021   ❤️ 1
    如果字段是 str,我建议加时间属性列(可以是硬加,然后写时间,也可以用虚拟列)实现。你这样直接比较走不了索引,效率不高
    zx4824
        4
    zx4824  
       Apr 27, 2021   ❤️ 1
    例:
    前端调取 2021-01 到 2021-06 的数据

    写个函数,穷举这六个月‘2021-01 、2021-02 、2021-03 、2021-04 、2021-05 、2021-06’设为数组 a

    数据库筛选,包含数组 a 的条目就可以了吧
    manami
        5
    manami  
    OP
       Apr 27, 2021
    @hjahgdthab750 是个历史遗留项目,表设计就很不合理,不管了……又不是不能用 / doge
    sexman
        6
    sexman  
       Apr 27, 2021   ❤️ 1
    replace('2021-04','-','') 比较字符串大小不就行了么
    anzu
        7
    anzu  
       Apr 27, 2021   ❤️ 1
    create_time 居然存的字符串?可以直接 create_time BETWEEN "2021-02" AND "2021-04" 吧
    manami
        8
    manami  
    OP
       Apr 27, 2021
    @anzu between 没法不包含后面那个月份,不行
    cornetCat
        9
    cornetCat  
       Apr 27, 2021   ❤️ 1
    楼主是妹子吧
    我上班逛 v2,其他同学看到只会吐槽我摸鱼,不会来帮我的。。。狗头
    manami
        10
    manami  
    OP
       Apr 27, 2021
    @anzu 没法包含,打错
    dqzcwxb
        11
    dqzcwxb  
       Apr 27, 2021   ❤️ 1
    数据库转换是没法用索引的,到后面性能巨差
    des
        12
    des  
       Apr 27, 2021   ❤️ 1
    用 IN 过滤可比你这快多了,一年也就 12 个月
    就算是查 10 年也才 120 个
    manami
        13
    manami  
    OP
       Apr 27, 2021
    @cornetCat “叔叔要生气了!”
    securityCoding
        14
    securityCoding  
       Apr 27, 2021   ❤️ 1
    走函数用不了索引哦
    wenzaiquan199
        15
    wenzaiquan199  
       Apr 27, 2021   ❤️ 1
    @cornetCat 年轻了,v 站上挂个可爱卡通妹子头像的基本上都是男娃娃
    mugglezzz
        16
    mugglezzz  
       Apr 27, 2021   ❤️ 1
    就算时间格式是字符串,不是也可以直接用 大于小于 比较吗? 月份是 01 呀
    Vegetable
        17
    Vegetable  
       Apr 27, 2021   ❤️ 1
    迷茫,直接字符串比较不行吗,搁这操作啥呢
    cheng6563
        18
    cheng6563  
       Apr 27, 2021   ❤️ 1
    直接字符串比较就行了,哪那么多事
    manami
        19
    manami  
    OP
       Apr 27, 2021
    @mugglezzz
    @Vegetable
    @cheng6563
    老哥们试试,我这里不行
    cheng6563
        20
    cheng6563  
       Apr 27, 2021
    @manami Mybatis 的日期参数也要用字符串,你是不是用了 Date 什么的。
    Jimmy1573
        21
    Jimmy1573  
       Apr 27, 2021   ❤️ 1
    @manami #13 女叔叔也是叔( doge
    zoharSoul
        22
    zoharSoul  
       Apr 27, 2021   ❤️ 1
    字符串可以直接比较的, 不要那样转换, 那样转换索引失效的.
    eric96
        23
    eric96  
       Apr 27, 2021   ❤️ 1
    timestamp 不是可以直接和字符串做比较吗,也一样能用到索引
    buster
        24
    buster  
       Apr 27, 2021   ❤️ 2
    where create_time between '2021-02' and '2021-04'
    TomVista
        25
    TomVista  
       Apr 27, 2021   ❤️ 1
    这样的同事请务必给我来一打
    boolstone
        26
    boolstone  
       Apr 28, 2021   ❤️ 1
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2558 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 02:49 · PVG 10:49 · LAX 19:49 · JFK 22:49
    ♥ Do have faith in what you're doing.