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.