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ó <[email protected]> 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 . <[email protected]>:
>
> 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ó <[email protected]> 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] [email protected]
>>> <[email protected]>
>>>  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: [email protected]
>>           [email protected]
>>
>> PHP Spanish Docs translator member.
>> http://www.php.net/manual/es/index.php
>>
>
>
>
> --
> *Ruben Fitó *
> Software Engineer
> [image: Ubiquat Technologies, SL] [email protected]
> <[email protected]>
>  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

Responder a