如何在雪花 sql 中使用 date_trunc 更改默认的星期几和时间戳
Posted
技术标签:
【中文标题】如何在雪花 sql 中使用 date_trunc 更改默认的星期几和时间戳【英文标题】:How to change the default day of week and timestamp using date_trunc in snowflake sql 【发布时间】:2018-09-19 21:53:18 【问题描述】:我有一个时间戳变量作为输入,我想按周对数据进行分组,一周定义为星期六 21:00:00 和星期六 20:59:59 之间。我正在从雪花数据库中查询。
我的数据如下所示:
employee_id | shift_started_at | hours_worked
1 | '2018-09-12 08:00:00' | 2
2 | '2018-09-10 22:00:00' | 8
1 | '2018-09-18 08:00:00' | 3
我正在尝试这样的事情:
alter session set week_start = 6;
SELECT dateadd('hour',21,date_trunc('week',shift_started_at)) as week_starts_at,
min(shift_started_at) as first_shift_of_week,
max(shift_started_at) as last_shift_of_week,
sum(hours_worked)
FROM table
group by 1;
但即使这个查询给了我正确的 week_starts_at 日期,min 和 max select 语句显示 group by 语句忽略了 dateadd 函数。简而言之,我的周数是从星期六的午夜到午夜。关于如何更改 date_trunc 使用的默认时间戳的任何建议?谢谢!
【问题讨论】:
【参考方案1】:问题是您在按小时调整时间之前应用了date_trunc(week..)
。一种解决方案是:
这是一个例子:
alter session set week_start = 7, timestamp_output_format='YYYY-MM-DD HH24:MI:SS DY';
create or replace table x(t timestamp);
insert into x values('2018-09-14 08:00:00'),('2018-09-15 20:59:59'),('2018-09-15 21:00:00'),('2018-09-16 23:00:00'), ('2018-09-22 20:59:59'),('2018-09-22 21:00:00');
select t, dateadd(hour, 3, t), date_trunc(week, dateadd(hour, 3, t)), dateadd(hour, -3, date_trunc(week, dateadd(hour, 3, t))) from x;
-------------------------+-------------------------+---------------------------------------+----------------------------------------------------------+
T | DATEADD(HOUR, 3, T) | DATE_TRUNC(WEEK, DATEADD(HOUR, 3, T)) | DATEADD(HOUR, -3, DATE_TRUNC(WEEK, DATEADD(HOUR, 3, T))) |
-------------------------+-------------------------+---------------------------------------+----------------------------------------------------------+
2018-09-14 08:00:00 Fri | 2018-09-14 11:00:00 Fri | 2018-09-09 00:00:00 Sun | 2018-09-08 21:00:00 Sat |
2018-09-15 20:59:59 Sat | 2018-09-15 23:59:59 Sat | 2018-09-09 00:00:00 Sun | 2018-09-08 21:00:00 Sat |
2018-09-15 21:00:00 Sat | 2018-09-16 00:00:00 Sun | 2018-09-16 00:00:00 Sun | 2018-09-15 21:00:00 Sat |
2018-09-16 23:00:00 Sun | 2018-09-17 02:00:00 Mon | 2018-09-16 00:00:00 Sun | 2018-09-15 21:00:00 Sat |
2018-09-22 20:59:59 Sat | 2018-09-22 23:59:59 Sat | 2018-09-16 00:00:00 Sun | 2018-09-15 21:00:00 Sat |
2018-09-22 21:00:00 Sat | 2018-09-23 00:00:00 Sun | 2018-09-23 00:00:00 Sun | 2018-09-22 21:00:00 Sat |
-------------------------+-------------------------+---------------------------------------+----------------------------------------------------------+
您可以用于分组的最后一列,应该可以正常工作。
【讨论】:
以上是关于如何在雪花 sql 中使用 date_trunc 更改默认的星期几和时间戳的主要内容,如果未能解决你的问题,请参考以下文章
sql 使用date_trunc(),add_months(),last_day()查找previuos /下个月的第一天和最后一天