V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yuann72
V2EX  ›  问与答

mysql 筛选某一天的记录的正确姿势是什么

  •  
  •   yuann72 · 2021-06-04 16:45:08 +08:00 · 1762 次点击
    这是一个创建于 1266 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一张表有一个created_at字段, timestamp类型, 现想要筛选出某一天的全部数据

    1. select * from XX where date(created_at) = '2021-01-01'
      全表扫描 pass
    2. select * from XX where created_at between '2021-01-01 00:00:00' and '2021-01-01 23:59:59'
      select * from XX where created_at >='2021-01-01 00:00:00' and created_at <= '2021-01-01 23:59:59'
      这种方式 where 条件就得加上 00:00:00 和 23:59:59
    3. 还有其他方式吗
    13 条回复    2021-06-05 08:09:21 +08:00
    mouxiaoshi
        1
    mouxiaoshi  
       2021-06-04 16:58:32 +08:00
    我们公司的业务是直接把业务日期字段(非创建时间字段)拆成了 year,month,day 的粒度,方便按年,月,日的组合查询
    AoEiuV020
        2
    AoEiuV020  
       2021-06-04 16:59:25 +08:00
    感觉这个 2 就比较合理了吧,1 是不是无法使用索引了,
    yuann72
        3
    yuann72  
    OP
       2021-06-04 17:30:47 +08:00
    @AoEiuV020 #2 我就是觉得 2 不够"优雅", 想看看还有没有其他方式
    clf
        4
    clf  
       2021-06-04 18:07:03 +08:00
    我可能会写成:
    select * from XX where created_at >='2021-01-01 00:00:00' and created_at < '2021-01-02 00:00:00'

    或者:
    BETWEEN '2021-01-01 00:00:00' AND '2021-01-02 00:00:00'
    (但这个我忘了 00 是前一天还是后一天的了。)

    其实我是把数据库里所有时间相关字段设置为时间戳。因为时间戳对所有开发语言是通用的而且都有封装的操作库。而且数据库的查询效率很高。timestap 还会受到时区影响吧。
    carity
        5
    carity  
       2021-06-04 18:18:42 +08:00
    2 少查了一秒数据
    raaaaaar
        6
    raaaaaar  
       2021-06-04 18:20:39 +08:00 via Android
    @carity 没有吧
    liuzhaowei55
        7
    liuzhaowei55  
       2021-06-04 19:16:58 +08:00 via iPhone   ❤️ 1
    2 楼说的是对的,函数无法使用索引
    sagaxu
        8
    sagaxu  
       2021-06-04 19:26:30 +08:00 via Android
    select * from XX where created_at >= '2021-01-01' and created_at < '2021-01-02'
    shingle
        9
    shingle  
       2021-06-04 23:10:54 +08:00 via iPhone
    楼上+1 只精确到日期,默认就会补全到 0 点
    akira
        10
    akira  
       2021-06-04 23:24:24 +08:00
    2. 或者加个字段放日期
    gasia
        11
    gasia  
       2021-06-05 02:23:26 +08:00 via Android
    @raaaaaar 是的,没有
    wy315700
        12
    wy315700  
       2021-06-05 06:19:55 +08:00 via iPhone   ❤️ 1
    >= 2021-01-01
    and < 2021-01-02
    Jaron0608
        13
    Jaron0608  
       2021-06-05 08:09:21 +08:00 via Android
    加个字段,日期分区
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:39 · PVG 03:39 · LAX 11:39 · JFK 14:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.