Re: ¿Extraño comportamiento en vista?

From: Anthony Sotolongo <asotolongo(at)gmail(dot)com>
To: Lautaro Palamidessi <lpalamidessi(at)conexia(dot)com>, Lista PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: ¿Extraño comportamiento en vista?
Date: 2019-09-10 13:15:50
Message-ID: 875abcb5-cdc4-765d-deaf-35a2b9e4d419@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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!

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2019-09-10 13:20:39 Re: ¿Extraño comportamiento en vista?
Previous Message Carlos T. Groero Carmona 2019-09-10 13:12:39 Re: pg_basebackup falla casi al terminar