[pgsql-es-ayuda] Re: [pgsql-es-ayuda] calculo preciso de años meses y dias
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
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
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
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
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
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 gonzalesescribió: > 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
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
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
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
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
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 gonzalesescribió: > 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
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