[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-16 Por tema Francisco Olarte
Estimado Felix:

Añado la lista en CC que no iba en tu mensaje original.

2017-05-16 13:18 GMT+02:00 felix gonzales :
> Estimado Francisco
> de manera "manual", me refiero a mirar un calendario (por ejemplo del
> sistema operativo o el que tienes pegado en la pared) y contar los meses y
> días entre dos fechas. por ejemplo del 15-02-2017 al 01-05-2017. Desde el 15
> de febrero hasta el 15 de abril tenemos 2 meses y del 16 de abril al 01 de
> mayo hay 16 días. resultado final: 2 meses y 16 días.

La parte de mirar el calendario la dabamos por echa. La parte de contar tambien.

El data point que nos das nos dice que en parte lo quires hacer
contando hacia adelante, hasta ahi bien.

Ahora solo nos falta que nos digas que hay que hace cuando sobran
dias, p.e. que hay que hacer cuando vas del 30 de enero al 13 de
marzo. El 30 de febrero no existe, luego que haces en ese caso,
cuentas dos dias para ir al 1 de febrero mas 28 para ir al 1 de marzo
mas 13 extra para llegar al 13 de marzo, dandote 43 dias, o cuentas un
mes para ir del penultimo dia de enero al penultimo ( 27 ) de febrero,
mas 1 dia para terminar febrero mas 13 dias para llegar al 13 de marzo
dando un toal de 1 mes y 14 dias, o cuentas 1 mes para ir del 30 de
enero al 30 de febrero = 2 de marzo mas 11 dias para llegar a 1 mes y
11 dias?


A lo que voy, y parece que no consigo que me entiendas, es a que si
describes adecuadamente un proceso manual quizas te podamos decir como
automatizarlo, pero si te limitas a dar un datapoint de "En este caso
concreto que me da 2m16d querria 2m16d" poco podemos hacer. Incluso
con la descripcion algo, aunque no mucho, mas prolija que has dado
siguen quedando muchos casos que no se sabe que hacer con ellos. De
hecho dudo mucho que tu hayas pensado en como hacerlo a mano. Es un
problema clasico con las rutinas de fechas. Sale algo que no te gusta,
parece que lo hace mal y que la forma correcta es "evidente" hasta que
empiezas a rascar y ves que no lo es tanto.

Por eso los que llevamos muchos años con estas cosas no decimos "la
forma manual evidente", lo intentamos en el pasado repetidas veces y
sabemos que no existe.

Saludos
   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


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema felix gonzales
Estimado Francisco, me refiero a lo siguiente:

primera linea:
 select AGE('29-04-2017','15-02-2017');
devuelve: 2 mons 14 days, lo cual es correcto si lo comparamos con un
resultado hecho manualmente.

segunda linea:
 select AGE('30-04-2017','15-02-2017');
devuelve: 2 mons 15 days, es correcto.

tercera linea:
 select AGE('01-05-2017','15-02-2017');
devuelve: 2 mons 14 days, *debería devolver: 2 mons 16 days*

como se ha comentado, el resultado se debe a la variación de días que tiene
cada mes.

Respecto a "años meses y días precisos" me refiero a tener el resultado tan
igual a ser calculado manualmente, por ello solicitaba sus comentarios para
desarrollar alguna solución.






2017-05-15 12:15 GMT-05:00 Francisco Olarte :

> Felix:
>
> 2017-05-15 15:16 GMT+02:00 felix gonzales :
> > Necesito obtener años meses y días precisos. utilizando la función AGE
> tengo
> > la dificultad que la primera y ultima linea me devuelve lo mismo, alguna
> > alternativa?
>
> Dejando aparte algunas cosas que ya te han dicho, puedes definir "años
> meses y dias precisos".
>
> > select AGE('29-04-2017','15-02-2017');
> > select AGE('30-04-2017','15-02-2017');
> > select AGE('01-05-2017','15-02-2017');
>
> > cualquier comentario bienvenido.
>
> Tu problema es el clasico cuando usas intervalos (age). El sistema
> intenta ser de utilidad separandote años/meses y dias, pero como los
> meses no son todos iguales te pasa eso. Si eres capaz de dar una
> definicion exacta de lo que quieres igual se te puede dar una
> solucion. Eso si, la definicion suele ser mucho mas dificil de dar de
> lo que parece, yo no me fiaria de ninguna de menos de un par de folios
> en tu caso.
>
> Porque postgres cree que te esta dando meses y dias precisos en ese
> caso, y probablemente para su definision lo son.
>
> Francisco Olarte.
>



-- 
Felix Gonzales


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema felix gonzales
gracias por el análisis y la recomendación Daymel.

2017-05-15 12:07 GMT-05:00 Daymel Bonne Solís :

> Hola nuevamente Felix:
>
> El cálculo de diferencias entre fechas dados en meses y días es un poco
> complicado, ya que los resultados pueden ser un poco confusos.
>
> Hay que tener en cuenta que la unidad meses no es una cantidad fija, si
> hacemos el cálculo se puede deducir el resultado que arroja la ejecución de 
> select
> AGE('01-05-2017','15-02-2017')
>
> Marzo (mes 03) tiene 31 dias
> Abril (mes 04) tiene 30 dias
>
> Ahora, la diferencia en días entre las dos fechas se puede obtener de la
> siguiente forma:
>
> dbonne=# select (extract(epoch from timestamptz '01-05-2017') -
> extract(epoch from timestamptz '15-02-2017')) / 60 / 60 / 24;
> ?column?
> --
>   75
> (1 fila)
>
> Finalmente 75 - 61 = 14. Por eso el resultado son 2 meses y 14 días.
>
> Por otro lado, hay que tener especial cuidado con la función
> justify_interval que menciona Diego, esta función maneja los intervalos de
> meses de 30 días, por lo que:
>
> dbonne=# select justify_interval('30 days');
> justify_interval
> --
> 1 mon
> (1 fila)
>
> dbonne=# select justify_interval('1 mon - 1 hour');
> justify_interval
> --
> 29 days 23:00:00
> (1 fila)
>
> Sin embargo:
>
> dbonne=# select justify_interval('31 days');
> justify_interval
> --
> 1 mon 1 day
> (1 fila)
>
> Finalmente mi recomendación es uses siempre la diferencia en días. No
> menciono por cierto, el problema que adiciona los usos horarios que tienen
> Horario de Verano, ese es otro tema ;).
>
> Saludos.
>
> El 15 de mayo de 2017, 08:16, felix gonzales
> escribió:
>
>> buen día lista,
>>
>> Necesito obtener años meses y días precisos. utilizando la función AGE
>> tengo la dificultad que la primera y ultima linea me devuelve lo mismo,
>> alguna alternativa?
>>
>> select AGE('29-04-2017','15-02-2017');
>> select AGE('30-04-2017','15-02-2017');
>> select AGE('01-05-2017','15-02-2017');
>>
>> cualquier comentario bienvenido.
>>
>> --
>> Felix Gonzales
>>
>>
>


-- 
Felix Gonzales


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema felix gonzales
así es Gerardo, parece que la resta de fechas es una alternativa.

2017-05-15 10:32 GMT-05:00 Gerardo Herzig :

> Me suena a que tiene que ver conque febrero pueda ser año bisiesto, o como
> ya apuntaron por ahi, al cambio de horario.
> De todos modos, la resta de fechas pareceria funcionar mejor:
>
> postgres=# select '29-04-2017'::timestamp - '15-02-2017',
> '01-05-2017'::timestamp - '15-02-2017';
>  ?column? | ?column?
> --+--
>  73 days  | 75 days
> (1 row)
>
>
> HTH
> Gerardo
>
> - Mensaje original -
> > De: "felix gonzales" 
> > Para: "PostgreSQL" 
> > Enviados: Lunes, 15 de Mayo 2017 10:16:50
> > Asunto: [pgsql-es-ayuda] calculo preciso de años meses y dias
> >
> > buen día lista,
> >
> > Necesito obtener años meses y días precisos. utilizando la función AGE
> > tengo la dificultad que la primera y ultima linea me devuelve lo mismo,
> > alguna alternativa?
> >
> > select AGE('29-04-2017','15-02-2017');
> > select AGE('30-04-2017','15-02-2017');
> > select AGE('01-05-2017','15-02-2017');
> >
> > cualquier comentario bienvenido.
> >
> > --
> > Felix Gonzales
> >
>



-- 
Felix Gonzales


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema Francisco Olarte
Felix:

2017-05-15 15:16 GMT+02:00 felix gonzales :
> Necesito obtener años meses y días precisos. utilizando la función AGE tengo
> la dificultad que la primera y ultima linea me devuelve lo mismo, alguna
> alternativa?

Dejando aparte algunas cosas que ya te han dicho, puedes definir "años
meses y dias precisos".

> select AGE('29-04-2017','15-02-2017');
> select AGE('30-04-2017','15-02-2017');
> select AGE('01-05-2017','15-02-2017');

> cualquier comentario bienvenido.

Tu problema es el clasico cuando usas intervalos (age). El sistema
intenta ser de utilidad separandote años/meses y dias, pero como los
meses no son todos iguales te pasa eso. Si eres capaz de dar una
definicion exacta de lo que quieres igual se te puede dar una
solucion. Eso si, la definicion suele ser mucho mas dificil de dar de
lo que parece, yo no me fiaria de ninguna de menos de un par de folios
en tu caso.

Porque postgres cree que te esta dando meses y dias precisos en ese
caso, y probablemente para su definision lo son.

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


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema Daymel Bonne Solís
Hola nuevamente Felix:

El cálculo de diferencias entre fechas dados en meses y días es un poco
complicado, ya que los resultados pueden ser un poco confusos.

Hay que tener en cuenta que la unidad meses no es una cantidad fija, si
hacemos el cálculo se puede deducir el resultado que arroja la
ejecución de select
AGE('01-05-2017','15-02-2017')

Marzo (mes 03) tiene 31 dias
Abril (mes 04) tiene 30 dias

Ahora, la diferencia en días entre las dos fechas se puede obtener de la
siguiente forma:

dbonne=# select (extract(epoch from timestamptz '01-05-2017') -
extract(epoch from timestamptz '15-02-2017')) / 60 / 60 / 24;
?column?
--
  75
(1 fila)

Finalmente 75 - 61 = 14. Por eso el resultado son 2 meses y 14 días.

Por otro lado, hay que tener especial cuidado con la función
justify_interval que menciona Diego, esta función maneja los intervalos de
meses de 30 días, por lo que:

dbonne=# select justify_interval('30 days');
justify_interval
--
1 mon
(1 fila)

dbonne=# select justify_interval('1 mon - 1 hour');
justify_interval
--
29 days 23:00:00
(1 fila)

Sin embargo:

dbonne=# select justify_interval('31 days');
justify_interval
--
1 mon 1 day
(1 fila)

Finalmente mi recomendación es uses siempre la diferencia en días. No
menciono por cierto, el problema que adiciona los usos horarios que tienen
Horario de Verano, ese es otro tema ;).

Saludos.

El 15 de mayo de 2017, 08:16, felix gonzales escribió:

> buen día lista,
>
> Necesito obtener años meses y días precisos. utilizando la función AGE
> tengo la dificultad que la primera y ultima linea me devuelve lo mismo,
> alguna alternativa?
>
> select AGE('29-04-2017','15-02-2017');
> select AGE('30-04-2017','15-02-2017');
> select AGE('01-05-2017','15-02-2017');
>
> cualquier comentario bienvenido.
>
> --
> Felix Gonzales
>
>


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema felix gonzales
Estimado Diego con rangos de fecha mas largos la aproximación al resultado
se extiende por ejemplo:

select justify_interval( ('14-01-2018'::timestamp -
'14-01-2017'::timestamp)::interval);

devuelve: 1 year 5 days




2017-05-15 10:50 GMT-05:00 Diego :

> Hola Felix, hice otra aproximación, pero ya sin la función AGE que se
> acerca un poco mas a lo que, me parece, buscas.
>
> En la docu https://www.postgresql.org/docs/current/static/functions-
> datetime.html, dice esto de justify: "Adjust interval so 30-day time
> periods are represented as months"
> O sea, no termino de entender si toma a todos los meses como de 30 días.
>
> select ('2017-04-29'::timestamp - '2017-02-15'::timestamp)::interval,
> justify_interval( ('2017-04-29'::timestamp -
> '2017-02-15'::timestamp)::interval ),
> ('2017-04-30'::timestamp - '2017-02-15'::timestamp)::interval,
> justify_interval( ('2017-04-30'::timestamp -
> '2017-02-15'::timestamp)::interval ),
> ('2017-05-01'::timestamp - '2017-02-15'::timestamp)::interval,
> justify_interval( ('2017-05-01'::timestamp -
> '2017-02-15'::timestamp)::interval )
> ;
>
>
> On 2017-05-15 12:00, felix gonzales wrote:
>
> omití indicar que no hay cambio por horario de verano.
>
> 2017-05-15 9:59 GMT-05:00 felix gonzales :
>
>> Hola Daymel
>>
>> log_timezone = 'America/Lima'# UTC-05:00
>>
>>
>>
>> 2017-05-15 9:50 GMT-05:00 Daymel Bonne Solís :
>>
>>> Hola Féliz:
>>>
>>> Dos preguntas:
>>>
>>> En que uso horario estás??
>>> Hubo cambio de hora por Horario de Verano???
>>>
>>> Saludos
>>>
>>> El 15 de mayo de 2017, 08:16, felix gonzales
>>> escribió:
>>>
 buen día lista,

 Necesito obtener años meses y días precisos. utilizando la función AGE
 tengo la dificultad que la primera y ultima linea me devuelve lo mismo,
 alguna alternativa?

 select AGE('29-04-2017','15-02-2017');
 select AGE('30-04-2017','15-02-2017');
 select AGE('01-05-2017','15-02-2017');

 cualquier comentario bienvenido.

 --
 Felix Gonzales


>>>
>>
>>
>> --
>> Felix Gonzales
>>
>>
>
>
> --
> Felix Gonzales
>
>
>


-- 
Felix Gonzales


Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema Diego
Hola Felix, hice otra aproximación, pero ya sin la función AGE que se 
acerca un poco mas a lo que, me parece, buscas.


En la docu 
https://www.postgresql.org/docs/current/static/functions-datetime.html, 
dice esto de justify: "Adjust interval so 30-day time periods are 
represented as months"

O sea, no termino de entender si toma a todos los meses como de 30 días.

select ('2017-04-29'::timestamp - '2017-02-15'::timestamp)::interval,
justify_interval( ('2017-04-29'::timestamp - 
'2017-02-15'::timestamp)::interval ),

('2017-04-30'::timestamp - '2017-02-15'::timestamp)::interval,
justify_interval( ('2017-04-30'::timestamp - 
'2017-02-15'::timestamp)::interval ),

('2017-05-01'::timestamp - '2017-02-15'::timestamp)::interval,
justify_interval( ('2017-05-01'::timestamp - 
'2017-02-15'::timestamp)::interval )

;


On 2017-05-15 12:00, felix gonzales wrote:

omití indicar que no hay cambio por horario de verano.

2017-05-15 9:59 GMT-05:00 felix gonzales >:


Hola Daymel

log_timezone = 'America/Lima'# UTC-05:00



2017-05-15 9:50 GMT-05:00 Daymel Bonne Solís
>:

Hola Féliz:

Dos preguntas:

En que uso horario estás??
Hubo cambio de hora por Horario de Verano???

Saludos

El 15 de mayo de 2017, 08:16, felix
gonzales>
escribió:

buen día lista,

Necesito obtener años meses y días precisos. utilizando la
función AGE tengo la dificultad que la primera y ultima
linea me devuelve lo mismo, alguna alternativa?

select AGE('29-04-2017','15-02-2017');
select AGE('30-04-2017','15-02-2017');
select AGE('01-05-2017','15-02-2017');

cualquier comentario bienvenido.

-- 
Felix Gonzales






-- 
Felix Gonzales





--
Felix Gonzales





[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema felix gonzales
omití indicar que no hay cambio por horario de verano.

2017-05-15 9:59 GMT-05:00 felix gonzales :

> Hola Daymel
>
> log_timezone = 'America/Lima'# UTC-05:00
>
>
>
> 2017-05-15 9:50 GMT-05:00 Daymel Bonne Solís :
>
>> Hola Féliz:
>>
>> Dos preguntas:
>>
>> En que uso horario estás??
>> Hubo cambio de hora por Horario de Verano???
>>
>> Saludos
>>
>> El 15 de mayo de 2017, 08:16, felix gonzales
>> escribió:
>>
>>> buen día lista,
>>>
>>> Necesito obtener años meses y días precisos. utilizando la función AGE
>>> tengo la dificultad que la primera y ultima linea me devuelve lo mismo,
>>> alguna alternativa?
>>>
>>> select AGE('29-04-2017','15-02-2017');
>>> select AGE('30-04-2017','15-02-2017');
>>> select AGE('01-05-2017','15-02-2017');
>>>
>>> cualquier comentario bienvenido.
>>>
>>> --
>>> Felix Gonzales
>>>
>>>
>>
>
>
> --
> Felix Gonzales
>
>


-- 
Felix Gonzales


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema felix gonzales
Hola Daymel

log_timezone = 'America/Lima'# UTC-05:00



2017-05-15 9:50 GMT-05:00 Daymel Bonne Solís :

> Hola Féliz:
>
> Dos preguntas:
>
> En que uso horario estás??
> Hubo cambio de hora por Horario de Verano???
>
> Saludos
>
> El 15 de mayo de 2017, 08:16, felix gonzales
> escribió:
>
>> buen día lista,
>>
>> Necesito obtener años meses y días precisos. utilizando la función AGE
>> tengo la dificultad que la primera y ultima linea me devuelve lo mismo,
>> alguna alternativa?
>>
>> select AGE('29-04-2017','15-02-2017');
>> select AGE('30-04-2017','15-02-2017');
>> select AGE('01-05-2017','15-02-2017');
>>
>> cualquier comentario bienvenido.
>>
>> --
>> Felix Gonzales
>>
>>
>


-- 
Felix Gonzales


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema Daymel Bonne Solís
Hola Féliz:

Dos preguntas:

En que uso horario estás??
Hubo cambio de hora por Horario de Verano???

Saludos

El 15 de mayo de 2017, 08:16, felix gonzales escribió:

> buen día lista,
>
> Necesito obtener años meses y días precisos. utilizando la función AGE
> tengo la dificultad que la primera y ultima linea me devuelve lo mismo,
> alguna alternativa?
>
> select AGE('29-04-2017','15-02-2017');
> select AGE('30-04-2017','15-02-2017');
> select AGE('01-05-2017','15-02-2017');
>
> cualquier comentario bienvenido.
>
> --
> Felix Gonzales
>
>


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias

2017-05-15 Por tema felix gonzales
Diego también lo he probado como indicas (antes de enviar a la lista) y se
presenta la misma dificultad
el problema esta en la tercera linea, en tus pruebas no utilizas dicha
linea.

2017-05-15 8:42 GMT-05:00 felix gonzales :

> Diego también lo he probado como indicas (antes de enviar a la lista) y se
> presenta la misma dificultad
> el problema esta en la tercera linea, en tus pruebas no utilizas dicha
> linea.
>
>
>
>
>
> 2017-05-15 8:37 GMT-05:00 Diego Alejandro Feito :
>
>> Hola Felix
>>
>> Proba así, no me devuelve lo mismo:
>>
>> select AGE(timestamp '2017-04-29',timestamp '2017-02-15')
>> , AGE(timestamp '30-04-2017',timestamp '2017-02-15')
>> ,AGE( '2017-04-29', '2017-02-15')
>> , AGE( '30-04-2017', '2017-02-15')
>> ;
>>
>>
>> On 2017-05-15 10:16, felix gonzales wrote:
>>
>> buen día lista,
>>
>> Necesito obtener años meses y días precisos. utilizando la función AGE
>> tengo la dificultad que la primera y ultima linea me devuelve lo mismo,
>> alguna alternativa?
>>
>> select AGE('29-04-2017','15-02-2017');
>> select AGE('30-04-2017','15-02-2017');
>> select AGE('01-05-2017','15-02-2017');
>>
>> cualquier comentario bienvenido.
>>
>> --
>> Felix Gonzales
>>
>>
>>
>
>
> --
> Felix Gonzales
>
>


-- 
Felix Gonzales