SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 6 de diciembre de 2010

Utilizar yesterday y today en PostgreSQL como Constantes

Introducción
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 1
search=> insert into havoc_test(nombre, fecha) values ('today', 'today'::date);
INSERT 0 1
search=> insert into havoc_test(nombre, fecha) values ('now', 'now()'::date);
INSERT 0 1
search=> select * from havoc_test;
  nombre   |   fecha    
-----------+------------
 yesterday | 2010-12-05
 today     | 2010-12-06
 now       | 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 VIEW
search=> 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.fecha
   FROM havoc_test
  WHERE 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 en la entrada