Questa SQLite:
date(date, '-' || strftime('%w', date) || ' days')
È, AFAIK, sottraendo il numero dei giorni della settimana (cioè 0 per domenica, 1 per lunedì, ...) da date
e quindi riconvertire il risultato in una date
; vedere il riferimento alla funzione data
per i dettagli.
Penso che l'equivalente per PostgreSQL sarebbe:
d - extract(dow from d)::int
dove d
è la tua data; sottraendo un numero intero da una data si sottrae quel numero di giorni. Se d
è un timestamp, quindi potrebbe essere necessario aggiungere alcuni casting. C'è date_trunc('week', 'd')
anche, ma questo inizia a contare i giorni da lunedì, quindi saresti fuori di uno con quello.
Ecco una rapida ripartizione di SQLite con la date
variabile sostituita da d
per evitare confusione con date()
funzione:
date(d, '-' || strftime('%w', d) || ' days')
Prima di tutto, ||
è l'operatore di concatenazione di stringhe SQL standard. Il strftime
funzione
è un formattatore di data e ora di uso generale che deriva da POSIX
; il %w
identificatore di formato significa "giorno della settimana come numero con domenica come giorno zero"; quindi il strftime
call ti dà 0 per domenica, 1 per lunedì e così via fino a 6 per sabato. Se d
è un martedì, quindi strftime
la chiamata produrrà 2 e il tutto finirà come:
date(d, '-2 days')
I modificatori per SQLite date
funzione
hanno varie forme ma '-2 days'
significa proprio quello che penseresti:sottrai due giorni da d
. Il risultato complessivo è che ottieni d
troncato alla settimana (dove la domenica è considerata il primo giorno della settimana).
Sul lato PostgreSQL:
d - extract(dow from d)::int
possiamo iniziare con extract
; extract
viene utilizzato per estrarre parti specifiche di una data o ora e dow
significa "giorno della settimana come numero con domenica come giorno zero". Suona familiare? Quindi il ::int
esegue il cast del numero DOW su un numero intero ed è necessario perché il DOW risulta effettivamente come un valore di doppia precisione e non è definito alcun operatore per sottrarre un doppio da una data in PostgreSQL; il cast può anche essere scritto nella forma standard come cast(x as int)
. Quando sottrai un intero da una data in PostgreSQL, sottrai quel numero di giorni; puoi essere più esplicito dicendo cose come - interval '3 days'
ma ciò aggiungerebbe solo più rumore in questo caso, quindi ho optato per la semplicità. Se è martedì, la nostra versione di PostgreSQL è simile a:
d - 2
ed è lo stesso di:
d - interval '2 days'
E dopo la sottrazione saremmo tornati domenica. C'è anche date_trunc
in PostgreSQL ma verrebbe troncato a lunedì non a domenica.