cancel
Showing results for 
Search instead for 
Did you mean: 

Calcular fechas

Former Member
0 Kudos

En el siguiente codigo, a partir de la fecha de vencimiento del documento, voy colocando los totales en columnas qeu tienen un rango de cada a15 dias y para eso estoy tratando de sacar las fechas cada 15 dias, ejemplo si la fecha de vto. es 31/03 entonces las columnas serian 15-abril, 30-abril, 15-mayo, 31-mayo, 15-junio, 30-junio, etc.

Pero tengo problemas cuando el mes tiene 31 dias o 28 como febrero, ya que la quincena siquiente me resta uno del dia 15. Y asi sucesivamente con los meses siguientes. Me dicen que haga una funcion aparte para calcular los meses pero no se como. O si alguien me podia ayudar como arreglar esta situacion.

Muchas gracias de antemano.

/*SELECT FROM [dbo].[OPCH] T0 */

DECLARE @FechaCorte AS DATETIME

/* WHERE */

SET @FechaCorte = '01-01-2010'--/* T0.docdate */'[%0]'

/*SELECT FROM [dbo].[OPCH] T0 */

DECLARE @FechaCorte1 AS DATETIME

/* WHERE */

SET @FechaCorte1 = '31-03-2010'--/* T0.docdate */'[%1]'

/*SELECT FROM [dbo].[OCRG] T2 */

DECLARE @grupo AS varchar (100)

/* WHERE */

SET @grupo = ' '--/* T2.Groupname */'[%2]'

DECLARE @FECHA AS DATETIME

DECLARE @FECHAA AS DATETIME

DECLARE @FECHA1 AS DATETIME

DECLARE @FECHA2 AS DATETIME

DECLARE @FECHA3 AS DATETIME

DECLARE @FECHA4 AS DATETIME

DECLARE @FECHA5 AS DATETIME

DECLARE @FECHA6 AS DATETIME

SET @FECHA = CONVERT(VARCHAR,@fechacorte1,112) --para quitar horas y minutos

SET @FECHAA = CONVERT(VARCHAR,@fechacorte,112)

SET @FECHA1 = (SELECT DATEADD(day, 15-Day(@FECHA), dateadd(month,1,@FECHA))) --PRIMERA QUINCENA DEL MES SIGUIENTE

SET @FECHA2 = (SELECT DATEADD(day, -Day(@FECHA) , dateadd(month,2,@FECHA))) --ULTIMO DIA DEL MES SIGUIENTE

SET @FECHA3 = (SELECT DATEADD(day, 15-Day(@FECHA), dateadd(month,2,@FECHA))) --PRIMERA QUINCENA DEL MES POSTERIOR

SET @FECHA4 = (SELECT DATEADD(day, -Day(@FECHA) , dateadd(month,3,@FECHA))) --ULTIMO DIA DEL MES POSTERIOR

SET @FECHA5 = (SELECT DATEADD(day, 15-Day(@FECHA), dateadd(month,3,@FECHA))) --PRIMERA QUINCENA DEL MES POSTERIOR

SET @FECHA6 = (SELECT DATEADD(day, -Day(@FECHA) , dateadd(month,4,@FECHA))) --ULTIMO DIA DEL MES POSTERIOR

SELECT T0.CardName AS 'Proveedor', T0.DocDate as 'Fecha Doc', T0.DocDueDate as 'Fecha Vencimiento', T0.DocTotal as 'Totales',

CASE WHEN MONTH(T0.DocDueDate) <= MONTH(@fechacorte1) THEN T0.DocTotal ELSE 0 END,

CASE WHEN (DAY(T0.DocDueDate)) <= DAY(@FECHA1) AND (MONTH(T0.DocDueDate)) = MONTH(@FECHA1) THEN T0.DocTotal ELSE 0 END,

CASE WHEN ((DAY(T0.DocDueDate)) > DAY(@FECHA1) AND (DAY(T0.DocDueDate)) <= DAY(@FECHA2)) AND

((MONTH(T0.DocDueDate)) = MONTH(@FECHA1) OR (MONTH(T0.DocDueDate)) = MONTH(@FECHA2)) THEN T0.DocTotal ELSE 0 END,

CASE WHEN (DAY(T0.DocDueDate)) <= DAY(@FECHA3) AND (MONTH(T0.DocDueDate)) = MONTH(@FECHA3) THEN T0.DocTotal ELSE 0 END,

CASE WHEN ((DAY(T0.DocDueDate)) > DAY(@FECHA3) AND (DAY(T0.DocDueDate)) <= DAY(@FECHA4)) AND

((MONTH(T0.DocDueDate)) = MONTH(@FECHA3) OR (MONTH(T0.DocDueDate)) = MONTH(@FECHA4)) THEN T0.DocTotal ELSE 0 END,

CASE WHEN (DAY(T0.DocDueDate)) <= DAY(@FECHA5) AND (MONTH(T0.DocDueDate)) = MONTH(@FECHA5) THEN T0.DocTotal ELSE 0 END,

CASE WHEN ((DAY(T0.DocDueDate)) > DAY(@FECHA5) AND (DAY(T0.DocDueDate)) <= DAY(@FECHA6)) AND

((MONTH(T0.DocDueDate)) = MONTH(@FECHA5) OR (MONTH(T0.DocDueDate)) = MONTH(@FECHA6)) THEN T0.DocTotal ELSE 0 END,

case when MONTH(T0.DocDueDate) > MONTH(@fechacorte1) THEN T0.DocTotal ELSE 0 END

FROM OPCH T0 INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode

INNER JOIN OCRG T2 ON T1.GroupCode = T2.GroupCode

WHERE MONTH(T0.DocDate) between MONTH(@FechaCorte) and month(@fechacorte1)

and YEAR(T0.DocDate) between YEAR(@FechaCorte) and (@fechacorte1)

and (T2.Groupname = @grupo OR @grupo = rtrim(isnull('','')))

GROUP BY T0.CardName, T0.DocDate, T0.DocDueDate,T0.DocTotal,t2.groupname

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Tal vez te pueda ayudar, pero podrias exponer mas a detalle lo que necesitar obtener con las fechas??

Saludos

Former Member
0 Kudos

Voy a explicar lo que se desea en el reporte

1- Por un rango de fechas selecciono de la tabla OPCH las facturas de proveedores, y a partir de su fecha de vencimiento (DocDueDate) determinaria en que rango de fechas caeria. Por ejemplo:

Fecha1 01/03/2010

Fecha2 30/04/2010

No.Doc F.Doc F.Vto. Total Mes Corriente 15-Mayo 31-Mayo 15-Junio 30-Junio 15-Julio 31-Julio

6229 05/03/2010 31/03/2010 260.00 260.00

6230 12/03/2010 12/05/2010 500.00 500.00

6231 05/04/2010 31/05/2010 780.00 780.00

6232 12/04/2010 25/06/2010 600.00 600.00

Se supone que el codigo debe hacerlo. Con el SET @fecha1, @fecha2, @fecha3, etc. debo calcular las quincenas y fin de mes de los 3 meses siguientes al mes de Fecha2, pero cuando el mes tiene 31 dias me quita entonces un dia de la quincena siguiente y me la deja en 14, y asi sucesivamente me va restando.

No se como plantearlo para que me funcione.

Answers (1)

Answers (1)

Former Member
0 Kudos

Hola, ¿lo que necesitas sacar es el dia 15 y dia ultimo de cada mes?, si es asi, lo que puedes hacer es lo siguiente:

Teniendo en cuenta esas fechas que pones como ejemplo, puedes hacer un ciclo de la fecha1 a la fecha2 y calcularias la fechas de esa manera

set @Fecha1 = '01/03/2010'

set @Fecha2 = '30/04/2010'

set @fechaactual = convert(datetime, cast(year((@fecha) + 1) as varchar) + '/' + Cast(month(@fecha) as varchar) + '/' + '01', 103) - 1

con esa operacion obtienes el dia primero del mes siguiente, a esa variable solo restale un dia y obtienes el dia ultimo del mes antrerior, sea cual sea el dia, en el caso de tus fechas de ejemplo, eso te regresaria 01/04/2010 menos un dia, o sea 31/03/2010, y si necesitas los dias 15, haz lo mismo pero sin sumarle 1 al mes y sumale los dias necesarios para que te de el dia 15, espero eso te sirva, sino cualquier cosa comentala y veo si te puedo ayudar en algo mas.

nota: en esa operacion de fechas, considera cuando el mes sea mes + 1 sea mayor a 12, en ese caso tendrias que sumarle una al año y mes hacerlo 1.

Saludos