Discussion:
int a date
Ruben Curto
2007-07-23 15:52:57 UTC
Permalink
Hola lista, es posible convertir un campo entero a tipo fecha?
Ej.:

# select numero::date + '10 days'::interval from tabla;
Cannot cast type 'int4' to 'date'

Muchas gracias
Mario Gonzalez
2007-07-23 16:10:34 UTC
Permalink
Post by Ruben Curto
Hola lista, es posible convertir un campo entero a tipo fecha?
# select numero::date + '10 days'::interval from tabla;
Cannot cast type 'int4' to 'date'
Postgres te lo esta diciendo, no puedes hacer esa conversion.
Generalmente una fecha se compone un un dia, un mes y 1 un año.

Que estas tratando de hacer?
-
Ruben Curto
2007-07-23 16:23:38 UTC
Permalink
Post by Mario Gonzalez
Post by Ruben Curto
Hola lista, es posible convertir un campo entero a tipo fecha?
# select numero::date + '10 days'::interval from tabla;
Cannot cast type 'int4' to 'date'
Postgres te lo esta diciendo, no puedes hacer esa conversion.
Generalmente una fecha se compone un un dia, un mes y 1 un año.
Que estas tratando de hacer?
Tengo una tabla donde las fechas estan guardadas como enteros (hoy, por
ej. es '20070723') y necesito obtener la suma de esa fecha mas 10 dias.

La tabla esta ya asi, tiene años, y hay un sistema que la consulta
desde varios lados, y la idea era ver si podia hacer lo anterior sin
modificar el campo a date, ya que quizas esto modifique el
funcionamiento del sistema (que no hice yo, por lo tanto tendria que
verificar todas las consultas a esta tabla).

gracias igualmente!
Miguel Rodríguez Penabad
2007-07-23 16:35:18 UTC
Permalink
Post by Ruben Curto
Tengo una tabla donde las fechas estan guardadas como enteros (hoy, por
ej. es '20070723') y necesito obtener la suma de esa fecha mas 10 dias.
Buff como está la tabla :)
Post by Ruben Curto
La tabla esta ya asi, tiene años, y hay un sistema que la consulta
desde varios lados, y la idea era ver si podia hacer lo anterior sin
modificar el campo a date, ya que quizas esto modifique el
funcionamiento del sistema (que no hice yo, por lo tanto tendria que
verificar todas las consultas a esta tabla).
Quizás encadenando casts: de int a text, y de text a date.
Mira los siguientes ejemplos

penabad=# select 20070509::int;
int4
----------
20070509
(1 row)

penabad=# select 20070509::int::date;
ERROR: cannot cast type integer to date
LINE 1: select 20070509::int::date;
^
penabad=# select 20070509::int::text;
text
----------
20070509
(1 row)

penabad=# select 20070509::int::text::date;
date
------------
09-05-2007
(1 row)
Mario Gonzalez
2007-07-23 16:41:25 UTC
Permalink
Post by Ruben Curto
Tengo una tabla donde las fechas estan guardadas como enteros (hoy, por
ej. es '20070723') y necesito obtener la suma de esa fecha mas 10 dias.
Tu base de datos es PostgreSQL o no? pregunto esto porque
representar una fecha con un entero, creo que no es la mejor manera de
hacerlo . Ademas, el trabajo y/o manipulacion de fechas esta muy bien
soportado.

Pienso que lo podras hacer con una consulta SQL simple pero si se me
ocurre como hacerlo en algun lenguaje de programacion, sin embargo no
se si eso es lo que necesitas.
--
http://www.advogato.org/person/mgonzalez/
Sebastián Villalba
2007-07-23 16:30:33 UTC
Permalink
Hola Mario....
Post by Ruben Curto
Post by Mario Gonzalez
Post by Ruben Curto
Hola lista, es posible convertir un campo entero a tipo fecha?
# select numero::date + '10 days'::interval from tabla;
Cannot cast type 'int4' to 'date'
Postgres te lo esta diciendo, no puedes hacer esa conversion.
Generalmente una fecha se compone un un dia, un mes y 1 un año.
Que estas tratando de hacer?
Tengo una tabla donde las fechas estan guardadas como enteros (hoy, por
ej. es '20070723') y necesito obtener la suma de esa fecha mas 10 dias.
La tabla esta ya asi, tiene años, y hay un sistema que la consulta
desde varios lados, y la idea era ver si podia hacer lo anterior sin
modificar el campo a date, ya que quizas esto modifique el
funcionamiento del sistema (que no hice yo, por lo tanto tendria que
verificar todas las consultas a esta tabla).
Pasando por alto la mala idea que fué guardar fechas en campos enteros,
existiendo tipo de dato "date" que es mucho mas apropiado, entiendo que sin
renegar demasiado, podrías obtener la fecha conociendo el formato de lo que
representa cada posición dentro del número.

Ayudándote con casts y algunas funciones como las que están en

http://www.postgresql.org/docs/8.2/static/functions-string.html

Calculo que deberías salir airoso. Saludos...
Post by Ruben Curto
gracias igualmente!
Por nada amigazo...

-
-------------------------------------------
Sebastián Villalba
sebastian-***@public.gmane.org
-------------------------------------------
Mario Gonzalez
2007-07-23 16:56:46 UTC
Permalink
Post by Sebastián Villalba
Hola Mario....
??!!
Post by Sebastián Villalba
Pasando por alto la mala idea que fué guardar fechas en campos enteros,
existiendo tipo de dato "date" que es mucho mas apropiado, entiendo que sin
renegar demasiado, podrías obtener la fecha conociendo el formato de lo que
representa cada posición dentro del número.
Creo que deberias escribirle Ruben y no a mi :-)
--
http://www.advog
Alvaro Herrera
2007-07-23 16:56:39 UTC
Permalink
Post by Ruben Curto
Tengo una tabla donde las fechas estan guardadas como enteros (hoy, por
ej. es '20070723') y necesito obtener la suma de esa fecha mas 10 dias.
Usa to_date:

alvherre=# select to_date(20070720, 'YYYYMMDD');
to_date
------------
2007-07-20
(1 fila)

alvherre=# select to_date(20070720, 'YYYYMMDD') + '10 days'::interval;
?column?
---------------------
2007-07-30 00:00:00
(1 fila)

(el de arriba es un timestamp)


alvherre=# select (to_date(20070720, 'YYYYMMDD') + '10 days'::interval)::date;
date
------------
2007-07-30
(1 fila)

(este es un date)
Post by Ruben Curto
La tabla esta ya asi, tiene años, y hay un sistema que la consulta
desde varios lados, y la idea era ver si podia hacer lo anterior sin
modificar el campo a date, ya que quizas esto modifique el
funcionamiento del sistema (que no hice yo, por lo tanto tendria que
verificar todas las consultas a esta tabla).
Estrategia para cambiar las aplicaciones: crea otra tabla que tenga la
columna de tipo date, mueve los datos hacia alla, y convierte tu tabla
en una vista que convierta la fecha a entero (probablemente usando
to_char).

Puedes dejar esa vista indefinidamente, y a medida que vayas cambiando
la aplicacion puedes cambiar esas partes donde lees esa vista, por
lecturas a la tabla. Cuando no quede ninguna referencia a la vista, la
borras.
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Ruben Curto
2007-07-23 17:33:58 UTC
Permalink
Post by Alvaro Herrera
alvherre=# select to_date(20070720, 'YYYYMMDD');
to_date
------------
2007-07-20
(1 fila)
Me quedo con esta. Muchas gracias a todos los que contestaron!

Alvaro Herrera
2007-07-23 16:18:36 UTC
Permalink
Post by Ruben Curto
Hola lista, es posible convertir un campo entero a tipo fecha?
# select numero::date + '10 days'::interval from tabla;
Cannot cast type 'int4' to 'date'
Por ejemplo, que numero convertirias a que fecha?

Yo convertiria el numero "0" a mi fecha de nacimiento. Realmente, es la
unica respuesta correcta. Asi, el numero 3652 es cuando cumpli diez
años. Obvio no?
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Gunnar Wolf
2007-07-23 15:49:21 UTC
Permalink
Post by Ruben Curto
Hola lista, es posible convertir un campo entero a tipo fecha?
# select numero::date + '10 days'::interval from tabla;
Cannot cast type 'int4' to 'date'
Por lo que amplías en una sub-respuesta, si esta operación no es
demasiado frecuetne, te sugiero hacer una función que haga la
conversión - Es bastante ineficiente, porque trata a tu número como
una cadena, lo parte en tres sub-cadenas y lo vuelve a pegar, antes de
hacer un cast a date. Además, es asquerosamente poco
confiable... ¿Puedes jurar que en tu BD no hay ninguna fecha como
'20061510' en vez de '20061015' por poner un ejemplo?

CREATE OR REPLACE FUNCTION int_to_date(integer) RETURNS date AS
$$
DECLARE
entrada ALIAS FOR $1;
cadena char(8);
dia char(2);
mes char(2);
anio char(4);
BEGIN
cadena = entrada::text;
anio = substr(cadena,1,4);
mes = substr(cadena,5,2);
dia = substr(cadena,7,2);
RETURN (anio || '-' || mes || '-' || dia)::date;
END;
$$ language 'plpgsql';

Si vas a realizar esta operación con cierta frecuencia, claro, te
conviene correr esto sobre _toda_ tu tabla y eliminar la columna en
formato texto.

Saludos,
--
Gunnar Wolf - gwolf-***@public.gmane.org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
Loading...