sql - 在 Google BigQuery 中使用 TIME_DIFF 和多个条件
问题描述
我正在尝试计算 Google BigQuery (SQL) 中特定日期的工作时间。
白天工作的工资是 10 美元,夜间工作的工资是 15 美元。白天时间定义为早上 6 点到晚上 10 点,而晚上时间定义为晚上 10 点到早上 6 点。
员工可以灵活地工作,因为他们是豪华轿车司机。
以下是我的表的示例:
ID | start_at | end_at | 日期 |
---|---|---|---|
abc123 | 04:00:00 | 07:00:00 | 2020-01-05 |
abc123 | 09:00:00 | 15:32:00 | 2020-01-05 |
abc123 | 23:00:00 | 23:35:00 | 2020-01-05 |
abc123 | 23:40:00 | 23:59:00 | 2020-01-05 |
abc123 | 23:59:00 | 01:35:00 | 2020-01-05 |
abc123 | 02:02:00 | 04:35:00 | 2020-01-06 |
abc123 | 05:40:00 | 06:59:00 | 2020-01-06 |
因此,实际工作时间是通过计算 start_at 和 end_at 之间的差异来计算的,但是白天和晚上的时间条件在我的查询中变得很麻烦..
*日期列基于 start_at。即使您从晚上 11:59 开始并在第二天凌晨 12:05 结束,日期也会跟随 start_at 而不是 end_at 的日期。
有任何想法吗?提前致谢!
解决方案
考虑以下解决方案
create temp function night_day_split(start_at time, end_at time, date date) as (array(
select as struct
extract(date from time_point) day,
if(extract(hour from time_point) between 6 and 22, 'day', 'night') day_night,
count(1) minutes
from unnest(generate_timestamp_array(
timestamp(datetime(date, start_at)),
timestamp(datetime(if(start_at < end_at, date, date + 1), end_at)),
interval 1 minute
)) time_point
group by 1, 2
));
select id, day,
sum(if(day_night = 'day', minutes, null)) day_minutes,
sum(if(day_night = 'night', minutes, null)) night_minutes
from yourtable,
unnest(night_day_split(start_at, end_at, date)) v
group by id, day
如果应用于您问题中的样本数据 - 输出是
推荐阅读
- python - 使用 HyperlinkedModelSerializer 我们可以制作一些没有 url 的字段(ForeignKey 字段),只有 id(如果没有详细视图)
- javascript - kendo ui grid - 如何在保持编辑对话框打开的同时取消更改
- python - 将字符串列表转换为熊猫中的行
- javascript - 笔记本电脑到手机(Twilio 可编程视频)显示黑屏
- julia - 在 Julia 中调用“MKL pardiso”的问题
- mongodb - 客户端 JavaScript 中 mongo shell 中的 NumberInt() 等价物是什么?
- python - 是否可以像这样抓取 javascript 图表?
- java - 来自 cassandra 检查的时间戳空值在 java 中失败
- mysql - 从秒转换为时间后截断不正确的时间值
- windows - 如何在多个文件上调用动词