Este SQLite:
date(date, '-' || strftime('%w', date) || ' days')
Es, AFAIK, restar el número de días del día de la semana (es decir, 0 para el domingo, 1 para el lunes, ...) de date
y luego convertir el resultado a una date
; consulte la referencia de la función de fecha
para más detalles.
Creo que el equivalente de PostgreSQL sería:
d - extract(dow from d)::int
donde d
es tu cita; restar un número entero de una fecha resta ese número de días. Si d
es una marca de tiempo, es posible que deba agregar algo de conversión. Hay date_trunc('week', 'd')
también, pero eso comienza a contar los días a partir del lunes, por lo que estaría fuera por uno con eso.
Aquí hay un desglose rápido de SQLite con la date
variable reemplazada por d
para evitar confusiones con date()
función:
date(d, '-' || strftime('%w', d) || ' days')
En primer lugar, ||
es el operador de concatenación de cadenas SQL estándar. El strftime
función
es un formateador de fecha y hora de propósito general que proviene de POSIX
; el %w
especificador de formato significa "día de la semana como un número, siendo el domingo el día cero"; entonces el strftime
call le da 0 para el domingo, 1 para el lunes, y así sucesivamente hasta 6 para el sábado. Si d
es martes, entonces el strftime
la llamada producirá 2 y todo terminará como:
date(d, '-2 days')
Los modificadores para SQLite date
función
tienen varias formas pero '-2 days'
significa exactamente lo que pensarías:restar dos días de d
. El resultado general es que obtienes d
truncado a la semana (donde el domingo se considera el primer día de la semana).
En el lado de PostgreSQL:
d - extract(dow from d)::int
podemos comenzar con extract
; extract
se usa para extraer partes específicas de una fecha u hora y dow
significa "día de la semana como un número, siendo el domingo el día cero". ¿Suena familiar? Entonces el ::int
convierte el número DOW en un número entero y es necesario porque DOW en realidad sale como un valor de doble precisión y no hay un operador definido para restar un doble de una fecha en PostgreSQL; el cast también se puede escribir en la forma estándar como cast(x as int)
. Cuando resta un número entero de una fecha en PostgreSQL, resta esa cantidad de días; puedes ser más explícito diciendo cosas como - interval '3 days'
pero eso solo agregaría más ruido en este caso, así que opté por la simplicidad. Si es martes, nuestra versión de PostgreSQL se ve así:
d - 2
y eso es lo mismo que:
d - interval '2 days'
Y después de la resta estaríamos de vuelta el domingo. También hay date_trunc
en PostgreSQL, pero eso se truncaría al lunes, no al domingo.