Re: [pgsql-es-ayuda] campos timestamp

2016-10-06 Por tema Alvaro Herrera
Magi Franquesa escribió:
> Hola,
> 
> 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*"

Haz un cast de cada uno al tipo correcto, y luego los juntas sumándolos:

alvherre=# create table magi (fecha timestamptz, hora timestamptz);
CREATE TABLE
alvherre=# insert into magi values ('1968-09-08 00:00:00+01', '1900-01-01 
10:00:00+00' at time zone 'UTC');
INSERT 0 1

alvherre=# select fecha, hora from magi;
 fecha  │ hora 
┼──
 1968-09-07 19:00:00-04 │ 1900-01-01 10:00:00-04:42:46
(1 fila)

alvherre=# select fecha::date, hora::time, fecha::date + hora::time from magi;
   fecha│   hora   │  ?column?   
┼──┼─
 1968-09-07 │ 10:00:00 │ 1968-09-07 10:00:00
(1 fila)


Observa que los valores de los husos horarios son "divertidos".  Querrás
ajustar eso, quizás.  Puedes usar el operador AT TIME ZONE; mira el
manual y experimenta un poco a ver si encuentras algo que tenga sentido.
Considera que el tipo "time" no lleva huso horario, en cambio "time with
time zone" sí lo lleva.  Igualmente, el tipo "timestamp" no lleva huso
horario, y "timestamp with time zone" sí lo lleva.

Considera también que un dato con huso horario significa "un dato que
está almacenado en UTC y que se convierte al huso horario configurado en
el parámetro TimeZone al momento de mostrarlo".  Al momento de guardar,
el dato se transforma desde el parámetro TimeZone a UTC.  Si no tienes
este efecto en cuenta, puede ser un poco confuso.

-- 
Álvaro Herrerahttps://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

-
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


Re: [pgsql-es-ayuda] campos timestamp

2016-10-06 Por tema Francisco Olarte
Hola Hellmuth...

2016-10-06 14:54 GMT+02:00 Hellmuth Vargas :
> 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

Y el resultado fue? porque no lo tengo muy claro. Con las zonas
p*t**ndo de por medio puede que no obtengas el mismo resultado siempre
( aqui utilizas TEXTO, eso es facil, no TSw/TZ, que es lo que pedia el
ejemplo original ).

Mira lo que pasa en mi maquina si cambio las constantes de texto a
timestamp with time zone, como en el ejemplo original:


n=> 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 ;
fecha|hora |  fechahora
-+-+-
 1968-09-08 00:00:00 | 1900-01-01 10:00:00 | 1968-09-08 10:00:00
(1 row)

n=> select cast('1968-09-08 00:00:00+01'::timestamp with time zone as
timestamp) as fecha,cast('1900-01-01 10:00:00+00'::timestamp with time
zone as timestamp) as hora, cast('1968-09-08 00:00:00+01'::timestamp
with time zone  as timestamp)+cast(cast('1900-01-01
10:00:00+00'::timestamp with time zone as timestamp) as time) as
fechahora;
fecha|hora |  fechahora
-+-+-
 1968-09-08 00:00:00 | 1900-01-01 09:45:16 | 1968-09-08 09:45:16
(1 row)

Siempre hay conversion de tipos, no hay que olvidar nunca que un
TSw/TZ internamente no es un bonito texto y NO TIENE LA ZONA HORARIA
ALMACENADA ( lo que es evidente si se miran los requisitos de
almacenamiento, que son los mismos para w/ que wo/ TZ ). Internamente
equivalente a un numero real gordo, un punto en la recta del tiempo.
La diferencia es que cuando lo imprimes si es w/TZ el sistema lo
imprime en la TIME ZONE activa en ese momento, mientras que si es
WO/TZ te imprime el equivalente a la zona UTC. Por eso cuando se
quieren guardar 'horas locales', es decir, la hora como la veia el
usuario, hay que guardar dos cosas, la zona del usuario y un timestamp
( este ultimo puede ser w/ o WO/, normalmente es mas facil wo/ pero
ambos valen ).

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


Re: [pgsql-es-ayuda] campos timestamp

2016-10-06 Por tema Hellmuth Vargas
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
escribió:

> Buenos dias:
>
> 2016-10-06 10:00 GMT+02:00 Magi Franquesa :
> > 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.68, .68*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
> 

Re: [pgsql-es-ayuda] campos timestamp

2016-10-06 Por tema Francisco Olarte
Buenos dias:

2016-10-06 10:00 GMT+02:00 Magi Franquesa :
> 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.68, .68*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, 

[pgsql-es-ayuda] campos timestamp

2016-10-06 Por tema Magi Franquesa
Hola,

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*"

Espero que me puedan ayudar

Muchas gracias

Magí