Этот SQLite:
date(date, '-' || strftime('%w', date) || ' days')
Is, AFAIK, вычитая число дней в неделе (то есть 0 для воскресенья, 1 для понедельника ...) из date
и затем преобразовывая результат обратно в date
; подробности см. в справочнике функций .
Я думаю, что эквивалент для PostgreSQL будет:
d - extract(dow from d)::int
где d
- ваша дата; вычитание целого числа из даты вычитает это количество дней. Если d
- это временная метка, вам может потребоваться добавить кастинг. Существует также date_trunc('week', 'd')
, но он начинает нумерацию дней с понедельника, так что вы будете на единицу с этим.
Вот краткий анализ SQLite с заменой переменной date
на d
, чтобы избежать путаницы с функцией date()
:
date(d, '-' || strftime('%w', d) || ' days')
Прежде всего, ||
- это стандартный оператор конкатенации строк SQL. strftime
функция - это форматер даты и времени общего назначения, полученный из POSIX ; спецификатор формата %w
означает «день недели как число с воскресеньем, являющимся нулевым днем»; таким образом, звонок strftime
дает вам 0 для воскресенья, 1 для понедельника и так далее до 6 для субботы. Если d
- вторник, то вызов strftime
даст 2, и все закончится как:
date(d, '-2 days')
Модификаторы для функции SQLite date
имеют различные формы, но '-2 days'
означает то, что вы думаете: вычтите два дня из d
. В итоге получается, что d
усекается до недели (где воскресенье считается первым днем недели).
На стороне PostgreSQL:
d - extract(dow from d)::int
мы можем начать с extract
; extract
используется для извлечения определенных частей даты или времени, а dow
означает «день недели как число с воскресным днем, равным нулю». Звучит знакомо? Затем ::int
преобразует число DOW в целое число, и оно необходимо, потому что DOW фактически выступает в качестве значения двойной точности, и в PostgreSQL не определен оператор для вычитания двойного числа из даты; актерский состав также может быть записан в стандартной форме как cast(x as int)
. Когда вы вычитаете целое число из даты в PostgreSQL, вы вычитаете это количество дней; Вы можете быть более точным, говоря что-то вроде - interval '3 days'
, но это просто добавит больше шума в этом случае, поэтому я выбрал простоту. Если это вторник, то наша версия PostgreSQL выглядит так:
d - 2
и это так же, как:
d - interval '2 days'
И после вычитания мы вернемся в воскресенье. В PostgreSQL также есть date_trunc
, но это будет урезано до понедельника, а не воскресенья.