Този SQLite:
date(date, '-' || strftime('%w', date) || ' days')
Е, AFAIK, изваждане на броя дни от деня в седмицата (т.е. 0 за неделя, 1 за понеделник, ...) от date
и след това преобразуване на резултата обратно в дата
; вижте референция за функцията за дата
за подробности.
Мисля, че еквивалентът за PostgreSQL би бил:
d - extract(dow from d)::int
където d
е вашата дата; изваждането на цяло число от дата изважда този брой дни. Ако d
е клеймо за време, тогава може да се наложи да добавите малко кастинг. Има date_trunc('week ', 'd')
също, но това започва да брои дните от понеделник, така че ще се разминете с един с това.
Ето кратка разбивка на SQLite с дата
променлива, заменена с d
за да избегнете объркване с date()
функция:
date(d, '-' || strftime('%w', d) || ' days')
Първо, ||
е стандартният оператор за конкатенация на SQL низове. strftime
функция
е инструмент за форматиране на дата и час с общо предназначение, който идва от POSIX
; %w
спецификатор на формат означава "ден от седмицата като число, като неделя е ден нула"; така че strftime
call ви дава 0 за неделя, 1 за понеделник и така нататък до 6 за събота. Ако d
е вторник, тогава strftime
call ще даде 2 и всичко завършва като:
date(d, '-2 days')
Модификаторите за SQLite date
функция
имат различни форми, но '-2 дни'
означава точно това, което бихте си помислили:извадете два дни от d
. Общият резултат е, че получавате d
съкратен до седмицата (където неделя се счита за първи ден от седмицата).
От страна на PostgreSQL:
d - extract(dow from d)::int
можем да започнем с extractкод>
; екстракт
се използва за извличане на конкретни части от дата или час и dow
означава "ден от седмицата като число, като неделя е ден нула". Звучи ли ви познато? След това ::int
превръща числото DOW в цяло число и е необходимо, защото DOW всъщност излиза като стойност с двойна точност и няма дефиниран оператор за изваждане на двойно от дата в PostgreSQL; прехвърлянето може също да бъде написано в стандартната форма като cast(x като int)
. Когато извадите цяло число от дата в PostgreSQL, изваждате толкова дни; можете да бъдете по-ясни, като кажете неща като - интервал '3 дни'
но това просто би добавило повече шум в този случай, така че избрах простотата. Ако е вторник, тогава нашата версия на PostgreSQL изглежда така:
d - 2
и това е същото като:
d - interval '2 days'
И след изваждането ще се върнем в неделя. Има също date_trunc
в PostgreSQL, но това ще бъде съкратено до понеделник, а не до неделя.