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

2021-06-04 16:45:08 +08:00
 yuann72

一张表有一个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. 还有其他方式吗
1788 次点击
所在节点    问与答
13 条回复
mouxiaoshi
2021-06-04 16:58:32 +08:00
我们公司的业务是直接把业务日期字段(非创建时间字段)拆成了 year,month,day 的粒度,方便按年,月,日的组合查询
AoEiuV020
2021-06-04 16:59:25 +08:00
感觉这个 2 就比较合理了吧,1 是不是无法使用索引了,
yuann72
2021-06-04 17:30:47 +08:00
@AoEiuV020 #2 我就是觉得 2 不够"优雅", 想看看还有没有其他方式
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
2021-06-04 18:18:42 +08:00
2 少查了一秒数据
raaaaaar
2021-06-04 18:20:39 +08:00
@carity 没有吧
liuzhaowei55
2021-06-04 19:16:58 +08:00
2 楼说的是对的,函数无法使用索引
sagaxu
2021-06-04 19:26:30 +08:00
select * from XX where created_at >= '2021-01-01' and created_at < '2021-01-02'
shingle
2021-06-04 23:10:54 +08:00
楼上+1 只精确到日期,默认就会补全到 0 点
akira
2021-06-04 23:24:24 +08:00
2. 或者加个字段放日期
gasia
2021-06-05 02:23:26 +08:00
@raaaaaar 是的,没有
wy315700
2021-06-05 06:19:55 +08:00
>= 2021-01-01
and < 2021-01-02
Jaron0608
2021-06-05 08:09:21 +08:00
加个字段,日期分区

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/781419

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX