使用 INTERVAL 查询日期范围
Using INTERVAL for querying date range
我们使用 clickhouse 作为我们的数据库,并且有一个 table 的列类型为 DateTime(
UTC)
.
我需要查询日期范围,例如:
SELECT *
FROM some_table
WHERE date_time_column BETWEEN ? AND ?
我有 Start
和 End
类型的参数 time.Time
但客户要求额外的选项:
基本上,他们想提供 Start
和一个偏移量。偏移量可以是天、小时、周或月。
由于我是新员工,之前从未与clickhouse合作过,所以我来这里寻求帮助。
我解决问题的努力:
我调查了 clickhouse 文档并找到 INTERVAL。
它看起来很适合我的任务,因为我有这样的想法:
SELECT *
FROM some_table
WHERE date_time_column BETWEEN ? AND ? + INTERVAL ? MONTH + INTERVAL ? WEEK + INTERVAL ? DAY + INTERVAL ? HOUR
这样我就可以对不需要的参数使用零,例如:
如果我们需要 3 个小时,我们会在伪代码中得到如下内容:
sqlx.db.Query(SELECT * FROM some_table WHERE date_time_column
BETWEEN ? AND ? + INTERVAL ? MONTH + INTERVAL ? WEEK + INTERVAL ? DAY + INTERVAL ? HOUR,
Start, Start, 0, 0, 0, 3)
如果我们需要 3 小时零 2 天,我们会在伪代码中得到如下内容:
sqlx.db.Query(SELECT * FROM some_table WHERE date_time_column
BETWEEN ? AND ? + INTERVAL ? MONTH + INTERVAL ? WEEK + INTERVAL ? DAY + INTERVAL ? HOUR,
Start, Start, 0, 0, 2, 3)
问题:
- 我的想法是否可行?
- 如果不是,你能告诉我如何实现上述要求吗?
除了clickhouse数据库,我们使用Golang和sqlx库与clickhouse进行通信。
对我来说,你的决定看起来不错。
我会通过计算 Stop-date 在 sql-script:
之外来稍微简化一下
import (
"time"
)
Start := ..
Stop := Start.AddDate(0, months, days + weeks*7).Add(time.Hour * time.Duration(hours))
SELECT *
FROM some_table
WHERE date_time_column BETWEEN ? AND ?
这种方式看起来更易于维护(不需要 CH SQL 的知识)和可测试性(从单元测试的角度来看)。
我们使用 clickhouse 作为我们的数据库,并且有一个 table 的列类型为 DateTime(
UTC)
.
我需要查询日期范围,例如:
SELECT *
FROM some_table
WHERE date_time_column BETWEEN ? AND ?
我有 Start
和 End
类型的参数 time.Time
但客户要求额外的选项:
基本上,他们想提供 Start
和一个偏移量。偏移量可以是天、小时、周或月。
由于我是新员工,之前从未与clickhouse合作过,所以我来这里寻求帮助。
我解决问题的努力:
我调查了 clickhouse 文档并找到 INTERVAL。
它看起来很适合我的任务,因为我有这样的想法:
SELECT *
FROM some_table
WHERE date_time_column BETWEEN ? AND ? + INTERVAL ? MONTH + INTERVAL ? WEEK + INTERVAL ? DAY + INTERVAL ? HOUR
这样我就可以对不需要的参数使用零,例如:
如果我们需要 3 个小时,我们会在伪代码中得到如下内容:
sqlx.db.Query(SELECT * FROM some_table WHERE date_time_column BETWEEN ? AND ? + INTERVAL ? MONTH + INTERVAL ? WEEK + INTERVAL ? DAY + INTERVAL ? HOUR, Start, Start, 0, 0, 0, 3)
如果我们需要 3 小时零 2 天,我们会在伪代码中得到如下内容:
sqlx.db.Query(SELECT * FROM some_table WHERE date_time_column BETWEEN ? AND ? + INTERVAL ? MONTH + INTERVAL ? WEEK + INTERVAL ? DAY + INTERVAL ? HOUR, Start, Start, 0, 0, 2, 3)
问题:
- 我的想法是否可行?
- 如果不是,你能告诉我如何实现上述要求吗?
除了clickhouse数据库,我们使用Golang和sqlx库与clickhouse进行通信。
对我来说,你的决定看起来不错。
我会通过计算 Stop-date 在 sql-script:
之外来稍微简化一下import (
"time"
)
Start := ..
Stop := Start.AddDate(0, months, days + weeks*7).Add(time.Hour * time.Duration(hours))
SELECT *
FROM some_table
WHERE date_time_column BETWEEN ? AND ?
这种方式看起来更易于维护(不需要 CH SQL 的知识)和可测试性(从单元测试的角度来看)。