Tento SQLite:
date(date, '-' || strftime('%w', date) || ' days')
Je, AFAIK, odečtením počtu dní v týdnu (tj. 0 pro neděli, 1 pro pondělí, ...) od date a poté převést výsledek zpět na date; viz referenční informace o funkci data
pro podrobnosti.
Myslím, že ekvivalent pro PostgreSQL by byl:
d - extract(dow from d)::int
kde d je vaše datum; odečtením celého čísla od data se tento počet dní odečte. Pokud d je časové razítko, pak možná budete muset přidat nějaké casting. Existuje date_trunc('week', 'd')
také, ale to začíná počítat dny od pondělí, takže s tím budete mít o jednu volno.
Zde je rychlý rozpis SQLite s date proměnná nahrazena d aby nedošlo k záměně s date() funkce:
date(d, '-' || strftime('%w', d) || ' days')
Nejprve || je standardní operátor zřetězení řetězců SQL. strftime funkce
je obecný formátovač data a času, který pochází z POSIX
; %w specifikátor formátu znamená "den v týdnu jako číslo, přičemž neděle je den nula"; tedy strftime call vám dá 0 pro neděli, 1 pro pondělí a tak dále až do 6 pro sobotu. Pokud d je úterý, pak strftime call dá 2 a celá věc skončí jako:
date(d, '-2 days')
Modifikátory pro SQLite date funkce
mají různé tvary, ale '-2 days' znamená přesně to, co si myslíte:odečtěte dva dny od d . Celkový výsledek je, že dostanete d zkráceno na týden (kde neděle je považována za první den v týdnu).
Na straně PostgreSQL:
d - extract(dow from d)::int
můžeme začít s extract
; extract se používá k extrahování určitých částí data nebo času a dow znamená "den v týdnu jako číslo, přičemž neděle je den nula". Zní povědomě? Poté ::int přetypuje číslo DOW na celé číslo a je potřeba, protože DOW ve skutečnosti vychází jako hodnota s dvojnásobnou přesností a není definován žádný operátor pro odečítání dvojnásobku od data v PostgreSQL; cast lze také zapsat ve standardním tvaru jako cast(x as int) . Když odečtete celé číslo od data v PostgreSQL, odečtete tolik dní; můžete být jasnější, když řeknete věci jako - interval '3 days' ale to by v tomto případě jen přidalo více hluku, takže jsem se rozhodl pro jednoduchost. Pokud je úterý, naše verze PostgreSQL vypadá takto:
d - 2
a to je stejné jako:
d - interval '2 days'
A po odečtení bychom se vrátili v neděli. Je zde také date_trunc
v PostgreSQL, ale to by se zkrátilo na pondělí, nikoli na neděli.