PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

strftime in sqlite converti in postgres

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.