Как изменить день недели по умолчанию и отметку времени, используя date_trunc в снежинке sql - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть переменная метки времени в качестве входных данных, и я хочу сгруппировать данные по неделям, причем неделя определена как между субботой 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 Ответ

0 голосов
/ 24 сентября 2018

Проблема в том, что вы применяете 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                                  |
-------------------------+-------------------------+---------------------------------------+----------------------------------------------------------+

Последний столбец, который вы можете использовать длягруппировка, и все должно работать.

...