Re: Consula por periodos actuales

From: Ruben Fitó <r(dot)fito(at)ubiquat(dot)com>
To: "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com>
Cc: raul andrez gutierrez alejo <raulandrez(at)gmail(dot)com>, "jvenegasperu (dot)" <jvenegasperu(at)gmail(dot)com>, "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Consula por periodos actuales
Date: 2014-06-16 09:46:57
Message-ID: CANiYpQweFr8HxXrZScTmEUn=B=EasdfrUx0ZJ033J09rPoiW=w@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola,

Bueno, por lo que veo no existe la posibilidad de crear "unidades de
tiempo" diferentes a 'DAY', 'WEEK', 'MONTH' para poder ser usadas dentro de
un función y que devuelvan la fecha inicial de período, con lo que hay que
calcularlo previamente o guardar los intervalos en una tabla a parte.

Raul: Me ha sido muy útil tu aportación ya que me permite enumerar en qué
"unidad de tiempo" estoy referente al mes actual. Con ello podré calcular
la primera fecha correspondiente a ese período. Supongo que lo usaré dentro
de una función para que me devuelva la fecha inicial de período.
(Consideraba el echo de que Postgres lo tuviera resuelto en algunas
funciones de datetime. Lástima!! jejeje )

Guillermo: Muchas gracias también a ti, pero no creo que se lleve a cabo.
Se prefiere que el cliente vaya configurado por un "tipo de periodo" sin
necesidad de actualizar una tabla donde se especifique los intervalos de
tiempo. Aunque lo tengo presente. Aquí todo es de mucha ayuda.

Muchas gracias a todos.

Un saludo.

2014-06-16 5:52 GMT+02:00 Guillermo E. Villanueva <guillermovil(at)gmail(dot)com>:

> Creo que deberías diseñar la base de datos de manera que puedas consultar
> de otra/s tabla/s cuales son los intervalos de tiempo de cada cliente
>
>
> Guillermo Villanueva
>
>
>
> El 13 de junio de 2014, 10:49, raul andrez gutierrez alejo <
> raulandrez(at)gmail(dot)com> escribió:
>
> Hola Ruben.
>>
>> la solución es floor( (to_char(fecha_venta,'DD')::int-1)/ 15 ) esto calcula
>> si es la primer quincena(0) o la segunda(1) quincena, aunque el 31 lo debe
>> validar ya que (31-1)/15=2
>>
>> ejemplo.
>>
>> select floor((to_char('2014-06-13'::date,'DD')::int-1)/ 15 ) ,
>> floor((to_char('2014-06-23'::date,'DD')::int-1)/ 15 ) ,
>> floor((to_char('2014-07-31'::date,'DD')::int-1)/ 15 )
>> union all
>> select floor((to_char('2014-06-13'::date,'DD')::int-1)/ 5 ) ,
>> floor((to_char('2014-06-23'::date,'DD')::int-1)/ 5 ) ,
>> floor((to_char('2014-07-31'::date,'DD')::int-1)/ 5 )
>>
>>
>>
>> El 13 de junio de 2014, 8:01, Ruben Fitó <r(dot)fito(at)ubiquat(dot)com> escribió:
>>
>> Hola,
>>>
>>> gracias por la respuesta, perdón si no me he sabido explicar, pero no
>>> necesito obtener la fecha de hace 10 días o 15 días sino la fecha del
>>> inicio del período de facturación.
>>>
>>> Un caso de uso seria:
>>>
>>> - Un cliente tiene configurado que se le facturará cada 10 días,
>>> empezando por el día 1 de cada mes.
>>> - Entonces, para que no se pase de ventas, en cada transacción hemos
>>> de mirar la suma de importes des de cada inicio de período:
>>> - caso A) Si estamos en el dia 5 del mes, se sumaran los importes
>>> del dia 1,2,3,4 y 5.
>>> - caso B) Si estamos en el dia 18 del mes, se sumaran los
>>> importes del dia 11, 12, 13, 14, 15,16, 17 y 18.
>>> - caso C) Si estamos en el dia 25 del mes, se sumaran los
>>> importes del dia 21, 22, 23, 24 y 25.
>>>
>>> Con ello, lo que quiero decir es según el período de facturación, me
>>> diga la fecha inicial con la que he de empezar a buscar:
>>>
>>> Ejemplo gráfico (cada 10 dias):
>>>
>>> *1,* 2, 3, 4, 5, 6, 7, 8, 9, 10, *11*, 12, 13, 14, 15, 16, 17, 18, 19,
>>> 20, *21,* *............ *último dia del mes
>>> |----------------------------| |-------------------------------------|
>>> |----------------------------------|
>>>
>>> Si estamos a día 13, la función que necesito me tendría que devolver la
>>> fecha del *dia 11* del mes, ya que ha partir de aquí he de calcular la
>>> suma de importes.
>>>
>>> No se si me he podido explicar mejor. jejeje
>>>
>>> Gracias,
>>>
>>> saludos
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> 2014-06-13 14:40 GMT+02:00 jvenegasperu . <jvenegasperu(at)gmail(dot)com>:
>>>
>>> Hola Ruben buenos dias
>>>>
>>>> para esos casos puedes usar interval
>>>>
>>>> select current_date, current_date - interval '10 day' as hace_10_dias;
>>>>
>>>> select current_date, current_date - interval '15 day' as hace_15_dias;
>>>>
>>>> http://www.postgresql.org/docs/9.3/static/functions-datetime.html
>>>>
>>>>
>>>> saludos
>>>>
>>>>
>>>> El 13 de junio de 2014, 7:10, Ruben Fitó <r(dot)fito(at)ubiquat(dot)com> escribió:
>>>>
>>>> Hola,
>>>>>
>>>>> me gustaría saber si existe alguna función en postgres que me permita
>>>>> buscar por diferentes "períodos" de mes, sin necesidad de hacer cálculos de
>>>>> periodos.
>>>>>
>>>>> Me explico, tenemos clientes que facturan cada mes, cada semana o
>>>>> cada 10 días(por mes), o sea que mensualmente:
>>>>>
>>>>> Cliente 1(por mes) se facturaran la compras realizadas des de el 1
>>>>> hasta final de mes.
>>>>> Cliente 2(por quincenas) se le facturaran las compras del 1 al 15 y
>>>>> del 15 hasta final de mes.
>>>>> Cliente 3(cada 10 días) se le facturaran las compras del 1 al 10, del
>>>>> 11 al 20 y del 21 a final de mes.
>>>>>
>>>>> Del mismo modo hay necesidad de hacer los cálculos de consumo por
>>>>> período en tiempo de ejecución, o sea, cuánto ha consumido hasta "ahora",
>>>>> en su periodo de facturación actual(mensual, quincenal o cada 10 días).
>>>>>
>>>>> Actualmente ahora tenemos en una función de bbdd los cálculos
>>>>> necesarios para determinar las fechas del periodo de facturación actual,
>>>>> pero hay necesidad de aplicar otro tipo de periodos(*semanalmente*,
>>>>> por ejemplo) en otros ámbitos y nos gustaría saber si existe alguna función
>>>>> en postgres que me permita distribuir los meses por diferentes periodos.
>>>>>
>>>>> Un ejemplo de lo que digo seria:
>>>>>
>>>>> SELECT sum(importe) FROM ventas WHERE cliente=12345 AND fecha_venta
>>>>> BETWEEN *inicio_periodo('X dias')* AND now();
>>>>>
>>>>>
>>>>> *incio_periodo* seria la función postgres donde le paso los días de
>>>>> duración del periodo, o también podría pasar una fracción del mes. No sé
>>>>> algo así.
>>>>>
>>>>> Una manera que he encontrado para hacerlo seria buscar las ventas del
>>>>> mes actual o de la semana actual.
>>>>>
>>>>> SELECT sum(importe) FROM ventas WHERE cliente=12345 fecha_venta
>>>>> BETWEEN (SELECT date_trunc('*MONTH*',now())::DATE) AND now(); -->
>>>>> para el mes actual.
>>>>> SELECT sum(importe) FROM ventas WHERE cliente=12345 fecha_venta
>>>>> BETWEEN (SELECT date_trunc('*WEEK*',now())::DATE) AND now(); -->
>>>>> para la semana actual.
>>>>> ?? --> Para la quincena actual
>>>>> ?? --> Para "decena" actual
>>>>>
>>>>> El problema está en que no puedo filtrar 'cada 10 dias' o 'cada
>>>>> quinzena' en esta consulta.
>>>>>
>>>>> Como lo veis, hay algo que pueda ayudarme??
>>>>>
>>>>>
>>>>> Muchas gracias de antemano.
>>>>>
>>>>> Saludos
>>>>>
>>>>>
>>>>> --
>>>>> *Ruben Fitó *
>>>>> Software Engineer
>>>>> [image: Ubiquat Technologies, SL] r(dot)fito(at)ubiquat(dot)com
>>>>> <j(dot)catarineu(at)ubiquat(dot)com>
>>>>> www.ubiquat.com
>>>>> Tota la informació continguda en aquest document i arxius adjunts és
>>>>> CONFIDENCIAL protegida per llei de secret comercial. Si l'ha rebut per
>>>>> error, si us plau elimini'l i posi's en contacte amb l'emissor.
>>>>>
>>>>> All information contained in this document and any attachments are
>>>>> CONFIDENTIAL and protected under trade secret laws. If you receive this
>>>>> message by mistake, please delete it and notify it immediately to the
>>>>> sender.
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> José Mercedes Venegas Acevedo
>>>> cel: Mov. 949808846
>>>>
>>>> mails: jvenegasperu(at)php(dot)net
>>>> jvenegasperu(at)gmail(dot)com
>>>>
>>>> PHP Spanish Docs translator member.
>>>> http://www.php.net/manual/es/index.php
>>>>
>>>
>>>
>>>
>>> --
>>> *Ruben Fitó *
>>> Software Engineer
>>> [image: Ubiquat Technologies, SL] r(dot)fito(at)ubiquat(dot)com
>>> <j(dot)catarineu(at)ubiquat(dot)com>
>>> www.ubiquat.com
>>> Tota la informació continguda en aquest document i arxius adjunts és
>>> CONFIDENCIAL protegida per llei de secret comercial. Si l'ha rebut per
>>> error, si us plau elimini'l i posi's en contacte amb l'emissor.
>>>
>>> All information contained in this document and any attachments are
>>> CONFIDENTIAL and protected under trade secret laws. If you receive this
>>> message by mistake, please delete it and notify it immediately to the
>>> sender.
>>>
>>
>>
>>
>> --
>> Raul Andres Gutierrez Alejo
>>
>
>

--
*Ruben Fitó *
Software Engineer
[image: Ubiquat Technologies, SL] r(dot)fito(at)ubiquat(dot)com
<j(dot)catarineu(at)ubiquat(dot)com>
www.ubiquat.com
Tota la informació continguda en aquest document i arxius adjunts és
CONFIDENCIAL protegida per llei de secret comercial. Si l'ha rebut per
error, si us plau elimini'l i posi's en contacte amb l'emissor.

All information contained in this document and any attachments are
CONFIDENTIAL and protected under trade secret laws. If you receive this
message by mistake, please delete it and notify it immediately to the
sender.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message jvenegasperu . 2014-06-16 21:15:42 archivos bytea en postgres ¿se produce el overhead aun usando la tabla solo para consultas individuales?
Previous Message Guillermo E. Villanueva 2014-06-16 03:52:11 Re: Consula por periodos actuales