当只有年、月和日可用时,如何根据日期范围筛选行?

  • 本文关键字:何根 日期 范围 筛选 mysql
  • 更新时间 :
  • 英文 :


我有这样的数据:

id  year    month   day
1   2020    11  1
2   2020    11  1
3   2020    12  31
4   2020    12  31
5   2021    1   1
6   2021    1   1
7   2021    1   31
8   2021    1   31
9   2021    2   1
10  2021    2   12

我希望选择两个日期之间的所有行。

我意识到我可以将年/月/日转换为时间戳,这将使这非常容易。实际上时间戳已经存在了,但是,底层表非常庞大(数百亿行),并且DB管理员已经在年/月/日列上设置了索引/集群,以便提供高性能的查询。在WHERE子句中直接使用实际时间戳的查询运行时间太长(小时),而使用年/月/日的查询运行时间在几秒钟内。

这是一个数据库<>提琴

澄清一下,这是一种方法,但你的问题是你的DBA,你的架构等等。你不能用这种方法解决这个问题,也不能浪费时间和资源。也许你需要问一个正确的方法来做到这一点与非SQL数据库在DBA堆栈交换站点。

无论如何,为了了解方式:

  1. 使用CONCAT和LPAD将数据转换为日期戳ISO: yyyyMMdd
  2. 将数据作为正常整数进行比较

示例:(当然你可以改变你的搜索值)

SELECT * from dt WHERE CONCAT(year,LPAD(month, 2, '0'),LPAD(day, 2, '0')) BETWEEN 20201231 AND 20210101

最新更新