sql >> Base de Datos >  >> RDS >> PostgreSQL

strftime en sqlite convertir a postgres

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.