PostgreSQL: как изменить день начала недели date_trunc с понедельника на другой день в sql-запросе?

Я хочу использовать функцию date_trunc в PostgreSQL в моем столбце datetime для агрегирования данных за неделю.

Например, мне нужно получать количество продаж каждую неделю.

Проблема в том, что date_trunc('week', datetime_column) функция считает понедельник днем ​​начала недели, и некоторые из моих клиентов используют другой день начала в календаре (например, субботу).

Я пытался

 SELECT date_trunc('WEEK',(time_id + interval '2 day'))- interval '2 day' AS WEEK

но это грязно, и я думаю, что должен быть способ получше.


person Seyed Mohammad Hosseini    schedule 30.07.2019    source источник
comment
Похоже, это хорошее решение. Я не вижу более чистого способа.   -  person Denys Séguret    schedule 30.07.2019
comment
Я полностью согласен с @ DenysSéguret   -  person S-Man    schedule 30.07.2019


Ответы (3)


Попробуй это

select
    datetime_column
    - extract(isodow from datetime_column) + 3  -- 3 is the weekday number to which we want to truncate
    - cast(extract(isodow from datetime_column) < 3 as int) * 7  -- 3 is the weekday number to which we want to truncate
from
    <table_name>
person Y.K.    schedule 30.07.2019
comment
Спасибо, но мой запрос более эффективен, чем ваш. Я имею в виду, что хотел предотвратить две дополнительные математические функции, чтобы не добавлять дополнительные функции - person Seyed Mohammad Hosseini; 31.07.2019
comment
Хорошо, этот просто работает для любого дня недели, на который вы хотите сократить дату (просто замените 3 на целое число от 1 до 7) - person Y.K.; 31.07.2019

попробуйте% (остаток от деления)

select i,
       now() + make_interval(days := i) "timestamp",
       extract(dow from now() + make_interval(days := i)) day_of_week,
       (extract(dow from now() + make_interval(days := i))::int+3)%7 day_of_week_shift
    from
        generate_series(0, 6) i
person Ilja Scherbina    schedule 30.07.2019

Мне нужен был более чистый и простой способ tranc_date week с любым начальным днем ​​недели, но, учитывая предоставленное решение, я думаю, что мой запрос - лучшее решение прямо сейчас.

Я думаю, что могу создать функцию, чтобы сделать ее более читаемой, но мне все еще нужен способ предотвратить выполнение двух математических операций для каждой записи.

Я сделаю свой код решением, но я был бы рад узнать, есть ли способ ускорить мой запрос.

 SELECT date_trunc('WEEK',(time_id + interval '2 day'))- interval '2 day' AS WEEK
person Seyed Mohammad Hosseini    schedule 31.07.2019
comment
Значит, вы отметили свой ответ как решение, даже если он такой же, как в вашем вопросе? - person alete; 16.12.2020
comment
Прошло больше года с тех пор, как я задал этот вопрос, и я не мог найти более чистого способа. Если у вас есть способ получше, добавьте ответ! @alete - person Seyed Mohammad Hosseini; 21.12.2020