Hace algunos días hablábamos de las opciones de Manejo de Fechas e Intervalos en PostgreSQL, y cómo se incluían unas <palabras reservadas> para obtener el día de ayer <yesterday> o de hoy <today>, por ejemplo:
search=> select 'today'::date;
date
------------
2010-12-06
(1 row)
search=> select 'yesterday'::date;
date
------------
2010-12-05
(1 row)
Partiendo de ello, vamos a ver algunas implicaciones de utilizar estas sustituciones dentro de Vistas, y cómo podemos solucionarlo.
Tabla de Ejemplo
Lo primero que vamos a hacer es crear una tabla llamada <havoc_test> donde pondremos un nombre y una fecha:
search=> create table havoc_test(nombre character varying, fecha date);CREATE TABLE
Ahora, añadimos unos registros con los valores de fecha de <yesterday>, <today> y <now()>
search=> insert into havoc_test(nombre, fecha) values ('yesterday', 'yesterday'::date);INSERT 0 1search=> insert into havoc_test(nombre, fecha) values ('today', 'today'::date);INSERT 0 1search=> insert into havoc_test(nombre, fecha) values ('now', 'now()'::date);INSERT 0 1search=> select * from havoc_test;nombre | fecha-----------+------------yesterday | 2010-12-05today | 2010-12-06now | 2010-12-06(3 rows)
Ahora, nos creamos una vista para obtener todos los registros de ayer, por ello, utilizaremos <fecha='yesterday'::date> como condición del where
search=> create or replace view yesterday_v as select * from havoc_test where fecha = 'yesterday'::date;CREATE VIEWsearch=> select * from yesterday_v;nombre | fecha-----------+------------yesterday | 2010-12-05(1 row)
El resultado es correcto, o mejor dicho, a simple vista es correcto, sin embargo, PostgreSQL nos sustituirá los valores de <yesterday> o <today> por los valores constantes, es decir, <2010-12-05> en nuestro caso.
Si nos fijamos en cómo PostgreSQL ha creado la vista, veremos que ha sustituido el valor de <yesterday> por el día de ayer:
search=> \d yesterday_v;View "public.yesterday_v"Column | Type | Modifiers--------+-------------------+-----------nombre | character varying |fecha | date |View definition:SELECT havoc_test.nombre, havoc_test.fechaFROM havoc_testWHERE havoc_test.fecha = '2010-12-05'::date;
Cuando nosotros lo que queríamos era que, en función del día actual, nos mostrase "ayer", pero no de forma constante.
Para solucionar este problema, simplemente pondremos <yesterday> como constante de texto, es decir, construiremos la cadena "al vuelo" y así PostgreSQL no realizará la sustitución hasta su ejecución. Veamos un ejemplo:
search=> create or replace view yesterday_v as
select * from havoc_test where fecha = cast('' || 'yesterday' || '' as date);
CREATE VIEW
search=> \d yesterday_v;
View "public.yesterday_v"
Column | Type | Modifiers
--------+-------------------+-----------
nombre | character varying |
fecha | date |
View definition:
SELECT havoc_test.nombre, havoc_test.fecha
FROM havoc_test
WHERE havoc_test.fecha = (((''::text || 'yesterday'::text) || ''::text)::date);
search=> select * from yesterday_v;
nombre | fecha
-----------+------------
yesterday | 2010-12-05
(1 row)
Conclusiones
Como podemos comprobar, ahora hemos conseguido lo que inicialmente queríamos, tratar los valores de <yesterday> como constante.
No hay comentarios:
Publicar un comentario