sql - 根据 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 查询来做到这一点?
解决方案
我不知道 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;
推荐阅读
- ios - 不同iOS版本的UIButton标题来源不同,里面有图片
- java - Java:System.out.println 方法在打印字节数组时丢失了一些行
- c - 为什么地址清理程序会在我的乘法矩阵中导致堆缓冲区溢出错误?
- shell - 在关闭打开它的应用程序时如何保持属性对话框打开?
- odoo - 仅在odoo11中隐藏特定模块中的“创建”按钮
- java - 我使用的是哪种 JVM 架构?
- vue.js - Vue Service Worker 离线无法在所有页面中工作
- python - 动态扩展小部件库
- javascript - Javascript 未通过 for 循环运行 - 无法定位 div 元素
- java - 如何在 thymeleaf th:if 中使用多个条件(和,或)