2010-01-13 97 views
25

Estoy creando un informe en MS SQL Server Reporting Services y necesito establecer los parámetros predeterminados de informe de fecha de inicio y fin para ser el primero y las últimas fechas del mes calendario anterior y necesitan ayuda.Buscar el primer y último día del mes calendario anterior en SQL Server Reporting Services (VB.Net)

El informe se genera en el segundo día del calendario del mes y necesito valores para:

Calendario Mes Anterior
- primer día
- último día

tengo estado trabajando con DateAdd, pero no he tenido éxito en crear una Expresión (en VB.NET como yo lo entiendo). ¡Realmente agradecería cualquier ayuda que me puedan dar!

Respuesta

3

en C#:

new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-1) 
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1) 
+2

puede simplemente cambiar 'nueva 'to' New' y llámelo VB.NET –

15
Dim thisMonth As New DateTime(DateTime.Today.Year, DateTime.Today.Month, 1) 
Dim firstDayLastMonth As DateTime 
Dim lastDayLastMonth As DateTime 

firstDayLastMonth = thisMonth.AddMonths(-1) 
lastDayLastMonth = thisMonth.AddDays(-1) 
+1

+1 para almacenar la "fecha de referencia" en una variable, lo que elimina la condición (bastante improbable, pero posible) de que haya un cambio de mes entre el primer cálculo y último día. –

+0

No he visto esto en producción, pero he visto una compilación programada rota por exactamente esta razón. :) –

3

no estoy familiarizado con SSRS, pero se puede conseguir el comienzo y el final del mes anterior en VB.Net utilizando el constructor DateTime, así:

Dim prevMonth As DateTime = yourDate.AddMonths(-1) 

Dim prevMonthStart As New DateTime(prevMonth.Year, prevMonth.Month, 1) 
Dim prevMonthEnd As New DateTime(prevMonth.Year, prevMonth.Month, DateTime.DaysInMonth(prevMonth.Year, prevMonth.Month)) 

(yourDate puede ser cualquier DateTime objeto, como DateTime.Today o #12/23/2003#)

2

Tenía algunas dificultades para traducir VB.NET real al subconjunto Expression que usa SSRS. Sin embargo, definitivamente me inspiraste y esto es lo que se me ocurrió.

StartDate 
=dateadd("d",0,dateserial(year(dateadd("d",-1,dateserial(year(Today),month(Today),1))),month(dateadd("d",-1,dateserial(year(Today),month(Today),1))),1)) 

End Date 
=dateadd("d",0,dateserial(year(Today),month(Today),1)) 

Sé que es un poco recurrente para el StartDate (primer día del mes pasado). ¿Hay algo que me falta aquí? Estos son estrictamente campos de fecha (es decir, no hay tiempo), pero creo que esto debería capturar el año bisiesto, etc.

¿Cómo lo hice?

0
 Dim aDate As DateTime = #3/1/2008# 'sample date 
    Dim StartDate As DateTime = aDate.AddMonths(-1).AddDays(-(aDate.Day - 1)) 
    Dim EndDate As DateTime = StartDate.AddDays(DateTime.DaysInMonth(StartDate.Year, StartDate.Month) - 1) 

    'to access just the date portion 
    ' StartDate.Date 
    ' EndDate.Date 
49

Randall, aquí están las expresiones VB he encontrado para trabajar en SSRS para obtener el primer y último día de cualquier mes, utilizando el mes actual como referencia:

primer día del último mes:

=dateadd("m",-1,dateserial(year(Today),month(Today),1)) 

primer día de este mes:

=dateadd("m",0,dateserial(year(Today),month(Today),1)) 

primer día del mes siguiente:

=dateadd("m",1,dateserial(year(Today),month(Today),1)) 

Último día del mes pasado:

=dateadd("m",0,dateserial(year(Today),month(Today),0)) 

último día de este mes:

=dateadd("m",1,dateserial(year(Today),month(Today),0)) 

Último día del mes siguiente:

=dateadd("m",2,dateserial(year(Today),month(Today),0)) 

El MSDN documentation for the VisualBasic DateSerial(year,month,day) function explica que la función acepta valores fuera del rango esperado para los parámetros year, month y day. Esto le permite especificar valores relativos a la fecha útiles. Por ejemplo, un valor de 0 para Day significa "el último día del mes anterior". Tiene sentido: es el día antes del día 1 del mes actual.

+5

El último día de este mes y el último día del mes siguiente son incorrectos; ambos suponen que los próximos meses tienen la misma cantidad de días que el mes anterior. Vea la respuesta de @Stephanie Grice para una mejor manera de hacer esto en una expresión de SSRS. – stubaker

2

Estaba buscando una respuesta simple para resolver esto yo mismo. aquí es lo que encontré

Esto dividirá el año y el mes, tomarse un mes de descanso y obtener el primer día.

firstDayInPreviousMonth = DateSerial(Year(dtmDate), Month(dtmDate) - 1, 1) 

Obtiene el primer día del mes anterior a partir de los actuales

lastDayInPreviousMonth = DateSerial(Year(dtmDate), Month(dtmDate), 0) 

Más detalles se pueden encontrar en: http://msdn.microsoft.com/en-us/library/aa227522%28v=vs.60%29.aspx

29

Estas funciones han sido muy útil para mí - sobre todo en el establecimiento hasta informes de suscripción; sin embargo, noté que al usar la función Último día del mes actual publicado anteriormente, funciona siempre que el mes en curso tenga la misma cantidad de días que el mes actual.He trabajado a través y probado estas modificaciones y espero que ayudan a otros desarrolladores en el futuro:

Fecha fórmulas: Buscar el primer día del mes anterior:

DateAdd("m", -1, DateSerial(Year(Today()), Month(Today()), 1)) 

Encuentra Último día del mes anterior:

DateSerial(Year(Today()), Month(Today()), 0) 

Buscar el primer día del mes actual:

DateSerial(Year(Today()),Month(Today()),1) 

Encuentra Último día del mes actual:

DateSerial(Year(Today()),Month(DateAdd("m", 1, Today())),0) 
0

Ésta le dará la fecha no hay tiempo:

=FormatDateTime(DateAdd("m", -1, DateSerial(Year(Today()), Month(Today()), 1)), 
DateFormat.ShortDate) 

Ésta le dará de fecha y hora:

=dateadd("m",-1,dateserial(year(Today),month(Today),1)) 
Cuestiones relacionadas