Hola Lista

Hice el siguuiente ejercicio:

select cast('1968-09-08 00:00:00+01' as timestamp) as
fecha,cast('1900-01-01 10:00:00+00' as timestamp) as hora, cast('1968-09-08
00:00:00+01' as timestamp)+cast(cast('1900-01-01 10:00:00+00' as timestamp)
as time) as fechahora



El 6 de octubre de 2016, 03:59, Francisco Olarte<fola...@peoplecall.com>
escribió:

> Buenos dias:
>
> 2016-10-06 10:00 GMT+02:00 Magi Franquesa <magifranqu...@gmail.com>:
> > Tengo una bd con registros de incendios en los que se indica la fecha y
> hora
> > de inicio en un campo de tipo "timestamp with time zone", pero el
> problema
> > es que en lugar de un solo campo con ambos datos hay dos campos: uno que
> > contiene la fecha correcta y el segundo la hora. Necesito crear un nuevo
> > campo del mismo tipo con la fecha y hora como muestro en el ejemplo
> > siguiente:
> >
> > Campo 1 (fecha inicio):"1968-09-08 00:00:00+01"
> > Campo 2 (hora inicio): "1900-01-01 10:00:00+00"
> > Resultado buscado:     "1968-09-08 10:00:00+00"
>
> Quieres extraer la ZONA HORARIA del registro 2? Eso depende mucho de
> tu base de datos de zonas y de tu zona de cliente predeterminada, a mi
> por ejemplo me pasa esto:
>
>
> n=> with base as (select '1968-09-08 00:00:00+01'::timestamp with time
> zone as ts_fecha,
> '1900-01-01 10:00:00+00'::timestamp with time zone as ts_hora)
> select * from base;
>         ts_fecha        |           ts_hora
> ------------------------+------------------------------
>  1968-09-08 00:00:00+01 | 1900-01-01 09:45:16-00:14:44
>
> Porque si, en España parece ser que por aquella epoca llevabamos el
> meridiano de Madrid, o algo asi, porque 14min:44 segs, ya que una hora
> son 15 grados de latitud, y 15*(14/60+44/3600)=3.683333, .683333*60 ~=
> 41, 3-41W que es la puerta del Sol, calle arriba calle abajo.
>
> Tienes varias formas de pegar eso, una es a lo burro en texto, jugando
> con substrings. Otra puede ser extrayendo las fechas y horas mediante
> casts:
>
>
> newtron=> with base as (select '1968-09-08 00:00:00+01'::timestamp
> with time zone as ts_fecha,
> '1900-01-01 10:00:00+00'::timestamp with time zone as ts_hora)
> select cast(ts_fecha as date) , cast(ts_hora as time with time zone) from
> base;
>   ts_fecha  |      ts_hora
> ------------+-------------------
>  1968-09-08 | 09:45:16-00:14:44
> (1 row)
>
>  Que solo con sumarse te da un resultado, pero puede no ser lo que quieres:
>
> newtron=> with base as (select '1968-09-08 00:00:00+01'::timestamp
> with time zone as ts_fecha,
> '1900-01-01 10:00:00+00'::timestamp with time zone as ts_hora)
> select cast(ts_fecha as date) + cast(ts_hora as time with time zone) from
> base;
>         ?column?
> ------------------------
>  1968-09-08 11:00:00+01
> (1 row)
>
> FIJATE que la rutina de salida de la fecha te lo da en la hora que
> estaba en efecto en esa epoca, si quieres FORMATEARLO en UTC no tienes
> mas que hacer:
>
> newtron=> set timezone to 'UTC';
>
> PERO entonces tienes el problema de que el cast intermedio a DATE te
> lo pasa por UTC y no te da lo que buscas:
>
> newtron=> with base as (select '1968-09-08 00:00:00+01'::timestamp
> with time zone as ts_fecha,
> '1900-01-01 10:00:00+00'::timestamp with time zone as ts_hora)
> select cast(ts_fecha as date) + cast(ts_hora as time with time zone) from
> base;
>         ?column?
> ------------------------
>  1968-09-07 10:00:00+00
> (1 row)
>
> Con lo que igual tienes que pasarlo a sin-timezone:
>
> newtron=> with base as (select '1968-09-08 00:00:00+01'::timestamp
> with time zone as ts_fecha,
> '1900-01-01 10:00:00+00'::timestamp with time zone as ts_hora)
> select (cast(ts_fecha as date) + cast(ts_hora as time with time zone))
> at time zone 'UTC' from base;
>       timezone
> ---------------------
>  1968-09-08 10:00:00
> (1 row)
>
> En general el problema es complicado, dado que los ts WITH tz designan
> un instante en el tiempo, convertirlos como tu quieres a FECHAS es
> imposible sin saber en que zona horaria estaban originalmente.
> Normalmente la forma correcta es pasar de ts WITH tz a WITHOUT tz, que
> ya no tiene problemas, operar ahi y luego reconvertir de vuelta, p.e.:
>
> newtron=> with base as (select '1968-09-08 00:00:00+01'::timestamp
> with time zone as ts_fecha,
> '1900-01-01 10:00:00+00'::timestamp with time zone as ts_hora)
> select (cast(ts_fecha at time zone 'Europe/Madrid' as date) +
> cast(ts_hora at time zone 'UTC' as time)) at time zone 'UTC' from
> base;        timezone
> ------------------------
>  1968-09-08 11:00:00+01
> (1 row)
>
> Observa que me sale en el horario mio ( Madrid ), si exploras las
> partes veras que el proceso es, primero sacar una fecha y hora sin
> zonas:
>
> newtron=> with base as (select '1968-09-08 00:00:00+01'::timestamp
> with time zone as ts_fecha,
> '1900-01-01 10:00:00+00'::timestamp with time zone as ts_hora)
> select cast(ts_fecha at time zone 'Europe/Madrid' as date),
> cast(ts_hora at time zone 'UTC' as time) from base;
>   timezone  | timezone
> ------------+----------
>  1968-09-08 | 10:00:00
> (1 row)
>
> newtron=> with base as (select '1968-09-08 00:00:00+01'::timestamp
> with time zone as ts_fecha,
> '1900-01-01 10:00:00+00'::timestamp with time zone as ts_hora)
> select cast(ts_fecha at time zone 'Europe/Madrid' as date) +
> cast(ts_hora at time zone 'UTC' as time) from base;
>       ?column?
> ---------------------
>  1968-09-08 10:00:00
> (1 row)
>
> Luego el cast lo interpreta en utc ( +00 ) y lo pasa a un instante en
> el tiempo, y luego como yo estoy en Madrid el sistema me pinta que
> hora era en Madrid en ese instante.
>
> Espero que te ayude, de aqui coge lo que te valga, intenta algo,
> pregunta si tienes mas dudas, recuerda que solo TU sabes exactamente
> como llegaron a tu BD esas columnas y como desenredarlas.
>
> Francisco Olarte.
>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>



-- 
Cordialmente,

Ing. Hellmuth I. Vargas S.
Esp. Telemática y Negocios por Internet
Oracle Database 10g Administrator Certified Associate
EnterpriseDB Certified PostgreSQL 9.3 Associate

Responder a