From: | Lautaro Palamidessi <lpalamidessi(at)conexia(dot)com> |
---|---|
To: | Lista PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | ¿Extraño comportamiento en vista? |
Date: | 2019-09-10 12:52:43 |
Message-ID: | CANQT3zV5xjApZQ28oH5j-=-AQZ=MBsVOQhKgZce-zeUOxT0mhA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Buenos días lista,
Hace unos días (el 2 de septiembre) tenía que "detectar" en una tabla las
transacciones de "ayer" y si bien lo lógico es usar una función con
parámetros "desde" y "hasta" que las filtre, por adaptar algo que ya
existía tomé para el lado de usar una vista con fechas filtradas entre
'yesterday' y 'today':
--Sobre una tabla que contenga un campo TIMESTAMP:
CREATE TABLE IF NOT EXISTS prueba (campo_fecha timestamp without time zone);
--Creo una vista que la filtre por los registros de "AYER":
CREATE OR REPLACE VIEW vw_prueba AS
SELECT campo_fecha
FROM prueba
WHERE campo_fecha BETWEEN 'yesterday' and 'today'; --> TRANSACCIONES DE
"AYER"
Ese día funcionó bien pero para mi sorpresa a partir del día siguiente
empezó a fallar mostrándome siempre las transacciones del mismo día
inicial.
--Entré a revisar mi vista:
--Me fijo cómo quedó la definicion:
select * from pg_get_viewdef('vw_prueba')
--y para mi sorpresa veo que devuelve:
" SELECT prueba.campo_fecha
FROM prueba
WHERE ((prueba.campo_fecha >= '2019-09-01 00:00:00'::timestamp without
time zone) AND (prueba.campo_fecha <= '2019-09-02 00:00:00'::timestamp
without time zone));"
o sea: Al compilar y grabar la vista, mis "variables" se convirtieron en
"constantes"!
La solución fue fácil, pasar:
1) 'yesterday' a CURRENT_DATE - '1 day'::interval
2) 'today' a CURRENT_DATE
y todo se arregló.
Pensé que las causas venían por lo "no determinista" del "today" pero para
desempatar probé compilar la vista usando "random()" y no hardcodeó valores
sino que respetó la funcion.
Las preguntas que hago a la lista son:
Si 'today' y 'yesterday' fueran funciones, ¿hay un bug al grabarse en la
vista como constantes?
Si 'today' y 'yesterday' fueran constantes: ¿por qué hoy valen una cosa y
mañana valen otra cosa?
Si 'today' y 'yesterday' no son ni funciones ni constantes, ¿qué son?
Estoy usando PostgreSQL 11.5 sobre Centos, pero probé que sucede desde al
menos 9.2 en adelante.
Saludos, gracias!
From | Date | Subject | |
---|---|---|---|
Next Message | Carlos T. Groero Carmona | 2019-09-10 13:12:39 | Re: pg_basebackup falla casi al terminar |
Previous Message | Stephen Amell | 2019-09-10 11:34:55 | Re: pg_basebackup falla casi al terminar |