none
Encontrar fecha inicio y fin del mes anterior

    Pregunta

  • Buen Dia a Tod@s!

    resulta que soy un BDA medio empirico medio capacitado, hasta ahora llevo seis meses de estar en una empresa trabajando en MSSQL2008 sobre Windows Server 2003.

    He tenido suerte pues las consultas que he tenido que programar me han resultado faciles. pero tengo una que para nada veo solucion:

     

    SELECT A.[Account] 'No.Cta',
            '' 'Ctas. Padre',
            A1.[AcctName] 'NombredelaCuenta',
            A1.[Levels],
            (select sum(B.[Credit])-sum(B.[Debit]) from JDT1 B   left join OACT B1 on B.[Account] = B1.[AcctCode] where B.[RefDate]  between (DATEADD(MONTH,-1,@FechaIni)) and (DATEADD(MONTH,-1,@FechaFin)) and B1.[AcctCode] = A.[Account] ),
            SUM(A.[Credit]),
            SUM(A.[Debit]),
             (((select sum(B.[Credit])-sum(B.[Debit]) from JDT1 B   left join OACT B1 on B.[Account] = B1.[AcctCode] where B.[RefDate]  between (DATEADD(MONTH,-1,@FechaIni)) and (DATEADD(MONTH,-1,@FechaFin)) and B1.[AcctCode] = A.[Account] )+SUM(A.[Debit]))-SUM(A.[Credit]))                                 
    FROM JDT1 A
        LEFT JOIN OACT A1 ON A.[Account] = A1.[AcctCode]
      /*LEFT JOIN OJDT A2 ON A.[TransId] = A2.[TransId]*/
    WHERE A.[RefDate] BETWEEN @FechaIni AND @FechaFin AND
             A1.[GroupMask] = 5
    GROUP BY A1.[FatherNum],
                A.[Account],
                A1.[AcctName],
                A1.[AcctCode],
                A1.[Levels]
    ORDER BY A1.[AcctCode]
    

    Este es un fragmento del Stored Procedure, mi consulta esta dirigida a encontrar el periodo del mes anterior, independientemente del rango de fechas que se ingresen.

     

    Hasta ayer crei tener completa la consulta pues estaba corriendo en rango 01xx2011 al 31xx2011, pero cuando ingreso 01xx2011 al 01xx2011, el DATEADD me lo convierte a 01ww2011 al 01ww2011(como debe ser) pero como hago, para que, a partir de las fechas independientemente del rango SQL me busque el saldo de la cuenta entre la primer fecha del mes anterior y la ultima fecha del mismo.

     

    Espero haberme explicado correctamente.

    Gracias de antemano!!!!!!


    AlexMeza Guanacolandia.
    viernes, 01 de abril de 2011 15:09

Respuestas

  • Hola,

    Para ser sincero, realmente no entiendo a plenitud lo que deseas, pero con el siguiente código puedes obtener el primer día y el último día de cada mes, en este caso el mes anterior (Marzo). Después de tener eso solo es cuestion de utilizarlo para el filtro deseado, donde la fecha este entre Primer Día del Mes y el Ultimo Día:

     

    Declare @Fecha datetime = GETDATE() - 1
    
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@Fecha)-1),@Fecha),105) As PrimerDiaMes
    
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@Fecha))),DATEADD(mm,1,@Fecha)),105) As UltimoDiaMes
    

     

    Fuente:

    IT Teach - Obtener primer día del mes

    IT Teach - Obtener último día del mes

     

    Espero que te sirva.


    Willy Taveras.-
    República Dominicana


    IT Learn - Learning Together
    IT Teach - Teaching Together

     


    • Editado Willy TaverasModerator viernes, 01 de abril de 2011 18:35 Agregando fuente.
    • Marcado como respuesta AlexMeza viernes, 01 de abril de 2011 23:33
    viernes, 01 de abril de 2011 16:19
    Moderador
  • Hola.

    Este tipo de cosas es mejor hacerlas paso a paso. Así, si quieres saber el primer día del mes anterior a una fecha dada, debes restarle un mes a esa fecha y luego fijar el día uno. Si quieres el último día del mes anterior, debes fijar el día 1 del mes de la fecha y restarle un día. Más o menos, sería así:

    declare @Fecha smalldatetime, @FechaIni smalldatetime, @FechaFin smalldatetime
    
    --una fecha dada
    select @Fecha = getdate() --Pero podría ser cualquier fecha
    
    --Resto un mes
    select dateadd(MM, -1, @Fecha)
    
    --Fijo el día 1 de ese mes, para lo cual convierto la fecha a char(6)
    select convert(char(6), dateadd(MM, -1, @Fecha), 112))
    
    --Y luego le sumo la cadena '01'
    select convert(char(6), dateadd(MM, -1, @Fecha), 112)) + '01'
    
    --Y lo convierto a fecha, esa es la fecha de inicio, el primer día del mes anterior
    select @FechaIni = cast(convert(char(6), dateadd(MM, -1, @Fecha), 112)) + '01' as smalldatetime)
    
    --La fecha de fin es muy parecida. Lo primer es obtener el primer día del mes de la fecha dada (lo mismo de @FechaIni, pero sin restar un mes)
    select cast(convert(char(6), @Fecha, 112)) + '01' as smalldatetime)
    
    --A esta fecha, le resto un día, con lo que tengo el último día del mes anterior
    select @FechaFin = dateadd(DD, -1, cast(convert(char(6), @Fecha, 112)) + '01' as smalldatetime))
    
    
    

    Y ya con las fechas entre las que realizar la consulta, podrás aplicar los filtros que desees a tu consulta. Si no fuera eso lo que buscas, nos dices.

     


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    viernes, 01 de abril de 2011 18:25
    Moderador

Todas las respuestas

  • Hola,

    Para ser sincero, realmente no entiendo a plenitud lo que deseas, pero con el siguiente código puedes obtener el primer día y el último día de cada mes, en este caso el mes anterior (Marzo). Después de tener eso solo es cuestion de utilizarlo para el filtro deseado, donde la fecha este entre Primer Día del Mes y el Ultimo Día:

     

    Declare @Fecha datetime = GETDATE() - 1
    
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@Fecha)-1),@Fecha),105) As PrimerDiaMes
    
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@Fecha))),DATEADD(mm,1,@Fecha)),105) As UltimoDiaMes
    

     

    Fuente:

    IT Teach - Obtener primer día del mes

    IT Teach - Obtener último día del mes

     

    Espero que te sirva.


    Willy Taveras.-
    República Dominicana


    IT Learn - Learning Together
    IT Teach - Teaching Together

     


    • Editado Willy TaverasModerator viernes, 01 de abril de 2011 18:35 Agregando fuente.
    • Marcado como respuesta AlexMeza viernes, 01 de abril de 2011 23:33
    viernes, 01 de abril de 2011 16:19
    Moderador
  • Hola.

    Este tipo de cosas es mejor hacerlas paso a paso. Así, si quieres saber el primer día del mes anterior a una fecha dada, debes restarle un mes a esa fecha y luego fijar el día uno. Si quieres el último día del mes anterior, debes fijar el día 1 del mes de la fecha y restarle un día. Más o menos, sería así:

    declare @Fecha smalldatetime, @FechaIni smalldatetime, @FechaFin smalldatetime
    
    --una fecha dada
    select @Fecha = getdate() --Pero podría ser cualquier fecha
    
    --Resto un mes
    select dateadd(MM, -1, @Fecha)
    
    --Fijo el día 1 de ese mes, para lo cual convierto la fecha a char(6)
    select convert(char(6), dateadd(MM, -1, @Fecha), 112))
    
    --Y luego le sumo la cadena '01'
    select convert(char(6), dateadd(MM, -1, @Fecha), 112)) + '01'
    
    --Y lo convierto a fecha, esa es la fecha de inicio, el primer día del mes anterior
    select @FechaIni = cast(convert(char(6), dateadd(MM, -1, @Fecha), 112)) + '01' as smalldatetime)
    
    --La fecha de fin es muy parecida. Lo primer es obtener el primer día del mes de la fecha dada (lo mismo de @FechaIni, pero sin restar un mes)
    select cast(convert(char(6), @Fecha, 112)) + '01' as smalldatetime)
    
    --A esta fecha, le resto un día, con lo que tengo el último día del mes anterior
    select @FechaFin = dateadd(DD, -1, cast(convert(char(6), @Fecha, 112)) + '01' as smalldatetime))
    
    
    

    Y ya con las fechas entre las que realizar la consulta, podrás aplicar los filtros que desees a tu consulta. Si no fuera eso lo que buscas, nos dices.

     


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    viernes, 01 de abril de 2011 18:25
    Moderador
  • Gracias a los dos!

    Ambas son la respuesta a lo que pregunte, me costo encontrar la logica de ambas ya que como antes mencione mis conocimientos teoricos de SQL son basados en 10 horas clase y orientada a reportes del sistema que usamos.

     

    Espero contar con ustedes en consultas posteriores.


    AlexMeza Guanacolandia.
    viernes, 01 de abril de 2011 23:17