Hola, según la documentación https://www.postgresql.org/docs/11/datatype-datetime.html#DATATYPE-DATETIME-INPUT

son valores/constantes de entrada del tipo de dato fecha, y que son convertidos al valor de fecha y tiempo una vez leídos, eso explica tu caso


/...//PostgreSQL//supports several special date/time input values for convenience, as shown in//Table 8.13 <https://www.postgresql.org/docs/11/datatype-datetime.html#DATATYPE-DATETIME-SPECIAL-TABLE>//. The values//|infinity|//and//|-infinity|//are specially represented inside the system and will be displayed unchanged; but the others are simply notational shorthands that will be converted to ordinary date/time values when read. (In particular,//|now|//and related strings are converted to a specific time value as soon as they are read.) All of these values need to be enclosed in single quotes when used as constants in SQL commands.../

Saludos

El 10-09-19 a las 09:52, Lautaro Palamidessi escribió:
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!

Reply via email to