Sql 使用间隔查询日期范围

Sql 使用间隔查询日期范围,sql,go,clickhouse,sqlx,Sql,Go,Clickhouse,Sqlx,我们使用clickhouse作为数据库,有一个表,其列类型为DateTime(UTC) 我需要查询日期范围,例如: SELECT * FROM some_table WHERE date_time_column BETWEEN ? AND ? 我有参数Start和End,属于time.time类型,但客户要求提供其他选项: 基本上,他们希望提供Start和偏移量。偏移量可以是天、小时、周或月 因为我是新员工,以前从未与clickhouse合作过,所以我来这里寻求帮助 我为解决这个问题所做的

我们使用clickhouse作为数据库,有一个表,其列类型为
DateTime(
UTC

我需要查询日期范围,例如:

SELECT * 
FROM some_table 
WHERE date_time_column BETWEEN ? AND ?
我有参数
Start
End
,属于
time.time
类型,但客户要求提供其他选项:

基本上,他们希望提供
Start
和偏移量。偏移量可以是天、小时、周或月

因为我是新员工,以前从未与clickhouse合作过,所以我来这里寻求帮助

我为解决这个问题所做的努力:

我已经调查了clickhouse文档并发现

它看起来很适合我的任务,因为我有这样的想法:

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)
    
      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)
    
  • 如果我们需要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, 0, 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, 2, 3)
    
问题:

  • 我的想法是否可行
  • 如果不是,你能告诉我如何实施上述要求吗

除了clickhouse数据库,我们还使用Golang和sqlx库与clickhouse进行通信。

对我来说,你的决定看起来不错

我将通过在sql脚本之外计算停止日期来简化它:

导入(
“时间”
)
开始:=。。
停止:=开始.AddDate(0,月,日+周*7)。添加(time.Hour*time.Duration(小时))
选择*
从某张桌子上
日期\时间\列之间的位置?然后呢?
这种方式看起来更易于维护(不需要了解CH SQL)和测试(从单元测试的角度来看)