【问题标题】:Using INTERVAL for querying date range使用 INTERVAL 查询日期范围
【发布时间】:2021-07-05 11:43:41
【问题描述】:

我们使用 clickhouse 作为我们的数据库,并且有一个列类型为 DateTime(UTC) 的表。

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

SELECT * 
FROM some_table 
WHERE date_time_column BETWEEN ? AND ?

我有 StartEnd 类型的参数 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 进行通信。

【问题讨论】:

    标签: sql go clickhouse sqlx


    【解决方案1】:

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

    我会通过在 sql-script 之外计算 Stop-date 来简化一下:

    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 知识)和可测试性(从单元测试的角度来看)。

    【讨论】:

      猜你喜欢
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 2011-08-19
      • 2019-08-16
      相关资源
      最近更新 更多