在SQL Server Reporting Services(VB.Net)中查找上一个日历月的第一天和最后一天

时间:2010-01-13 20:25:55

标签: vb.net date reporting-services calendar

我正在MS SQL Server Reporting Services中创建报告,需要将默认的“开始日期”和“结束日期”报告参数设置为上一个日历月的第一个和最后一个日期,并需要帮助。

该报告是在该月的第二个日历日生成的,我需要以下值:

  

上个月历月    - 第一天
   - 最后一天

我一直在使用DateAdd,但是没有成功创建一个Expression(在我理解的VB.NET中)。我非常感谢你能给我的任何帮助!

9 个答案:

答案 0 :(得分:63)

Randall,这里是我发现在SSRS中工作的VB表达式,用于获取任意月份的第一天和最后一天,使用当前月份作为参考:

上个月的第一天:

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

本月第一天:

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

下个月的第一天:

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

上个月的最后一天:

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

本月最后一天:

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

下个月的最后一天:

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

MSDN documentation for the VisualBasic DateSerial(year,month,day) function说明该函数接受yearmonthday参数的预期范围之外的值。这允许您指定有用的日期相对值。例如,Day的值为0表示“前一个月的最后一天”。这是有道理的:那就是当月第1天的前一天。

答案 1 :(得分:32)

这些功能对我非常有帮助 - 特别是在设置订阅报告时;但是,我注意到在使用上面公布的当月最后一天功能时,只要正在进行的月份与当前月份具有相同的天数,它就会起作用。我已经完成并测试了这些修改,希望它们能在未来帮助其他开发人员:

日期公式: 找到上个月的第一天:

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

查找上个月的最后一天:

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

查找本月的第一天:

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

查找当月的最后一天:

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

答案 2 :(得分:16)

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)

答案 3 :(得分:4)

我不熟悉SSRS,但您可以使用DateTime构造函数在VB.Net中获取上个月的开头和结尾,如下所示:

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可以是任何DateTime对象,例如DateTime.Today#12/23/2003#

答案 4 :(得分:3)

在C#中

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

答案 5 :(得分:3)

我在将实际的VB.NET转换为SSRS使用的Expression子集时遇到了一些困难。你的确激励了我,这就是我想出来的。

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))  

我知道StartDate(上个月的第一天)有点递归。这里有什么我想念的吗?这些是严格的日期字段(即没有时间),但我认为这应该是闰年等等。

我是怎么做的?

答案 6 :(得分:2)

我一直在寻找一个简单的答案来解决这个问题。这是我发现的

这将分开年份和月份,休假一个月并获得第一天。

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

从当前

获取上个月的第一天
lastDayInPreviousMonth = DateSerial(Year(dtmDate), Month(dtmDate), 0)

更多细节可在以下网址找到: http://msdn.microsoft.com/en-us/library/aa227522%28v=vs.60%29.aspx

答案 7 :(得分:1)

这个会给你约会时间:

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

这个会给你日期时间:

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

答案 8 :(得分: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