首页 > 解决方案 > 根据 Impala 中的条件计算两个时间戳之间的时间差

问题描述

我正在使用 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 查询来做到这一点?

标签: sqlimpala

解决方案


我不知道 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;

推荐阅读