Този 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, но това ще бъде съкратено до понеделник, а не до неделя.