我有这样的数据:
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堆栈交换站点。
无论如何,为了了解方式:
- 使用CONCAT和LPAD将数据转换为日期戳ISO: yyyyMMdd
- 将数据作为正常整数进行比较
示例:(当然你可以改变你的搜索值)
SELECT * from dt WHERE CONCAT(year,LPAD(month, 2, '0'),LPAD(day, 2, '0')) BETWEEN 20201231 AND 20210101