如何在雪花 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..)。一种解决方案是:

首先,将轮班时间向前移动 3 小时,因此晚上 9 点的轮班从周日午夜开始 然后截断为一周,星期天是一周的第一天 然后将结果向后移动 3 小时,到星期六的 21 小时

这是一个例子:

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 作为时间戳?

如何在雪花中的 SQL 中查找以分钟为单位的时差

sql 使用date_trunc(),add_months(),last_day()查找previuos /下个月的第一天和最后一天

如何将存储在雪花中的所有视图下载到本地机器

如何在雪花sql中将单列拆分为多列[重复]