【问题标题】:Compute time difference between two timestamps based on conditions in Impala根据 Impala 中的条件计算两个时间戳之间的时间差
【发布时间】:2020-07-13 14:06:44
【问题描述】:

我正在使用 Impala,并且我的表格格式如下:

ID        OLD_TIMESTAMP        NEW_TIMESTAMP
1234      2020-07-01 13:30     2020-07-01 18:00
2364      2020-07-02 07:30     2020-07-02 11:30
5746      2020-07-01 10:00     2020-07-03 12:30
5864      2020-07-10 23:45     2020-07-11 09:00

我需要做的是每天和每个 ID 计算 NEW_TIMESTAMP 和 OLD_TIMESTAMP 之间的差异(以小时为单位),但只考虑 08:00 和 23:30 之间的时间。 换句话说,这应该是输出:

ID        DAY            HOURS_DIFF
1234      2020-07-01     4.5
2364      2020-07-02     3.5
5746      2020-07-01     13.5
5746      2020-07-02     15.5
5746      2020-07-03     4.5
5864      2020-07-11     1.0

有没有办法通过 Impala 中的 SQL 查询来做到这一点?

【问题讨论】:

    标签: sql impala


    【解决方案1】:

    我不知道 Impala,但我假设如果你在那里减去两个日期,你会得到它们之间的 天数。此代码未经测试,现在可能不适合您。

    如果你的new_timestamp的时间小于23:30,你应该把new_timestamp保持不变,否则你应该把new_timestamp的天加上23:30。最后你会得到一个时间戳,不大于23:30

    old_timestamp 类似,但您会得到一个日期,不少于8:00

    减去两个结果,你会得到两者之间的天数,再乘以 24 就是小时数。

    SELECT id, 
      trunc(old_timestamp, 'DD') AS day, 
      (CASE
        WHEN new_timestamp - trunc(new_timestamp, 'DD') > 24/23 + (24*60)/30 /*23 hours 30 minutes*/
        THEN minutes_add(trunc(new_timestamp, 'DD'), 23*60 + 30)
        ELSE new_timestamp
      END + CASE 
        WHEN old_timestamp - trunc(old_timestamp, 'DD') > 24/8 /*8 hours*/
        THEN old_timestamp
        ELSE minutes_add(trunc(old_timestamp, 'DD'), 8*60)
      END) * 24 AS hours_diff
    FROM t;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2019-06-10
      相关资源
      最近更新 更多