2010-01-13 107 views
25

我在MS SQL Server Reporting Services中创建报告,并且需要将默认开始和结束日期报告参数设置为第一个和上个日历月的最后日期,需要帮助。在SQL Server Reporting Services(VB.Net)中查找上一个日历月的第一天和最后一天

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

前一个月的
-
第一天 - 最后一天

我已经一直在使用DateAdd,但尚未成功创建表达式(在VB.NET中,据我了解)。我真的很感激你能给我的任何帮助!

回答

3

在C#:

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

你可以改变'新'将'new'称为VB.NET – 2010-01-13 20:29:53

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,用于将“参考日期”存储在一个变量中,这消除了在计算第一个值之间存在月份移位的情况下(很不可能但可能)的情况和最后一天。 – 2010-01-13 20:34:01

+0

我在生产中没有看到过这个,但是我已经看到了一个正确的原因。 :) – 2010-01-13 20:39:28

3

我不熟悉的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#或)

2

我在将实际的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(上个月的第一天)有点递归。有什么我在这里失踪?这些都是严格的日期字段(即没有时间),但我认为这应该捕捉闰年等。

我该怎么办?

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

兰德尔,这里是我发现在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",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解释说,

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

这个月的最后一天该函数接受值超出yearmonthday参数的预期范围。这允许您指定有用的日期相对值。例如,Day的值为0意味着“前一个月的最后一天”。它是有道理的:那是当前月份的第一天前一天。

+5

本月的最后一天和下个月的最后一天不正确;都假设未来几个月的天数与前一个月的天数相同。请参阅@Stephanie Grice的答案,以更好地实现SSRS表达式。 – stubaker 2014-10-02 20:16:44

29

这些功能一直对我非常有帮助:

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

获取前一个月的第一天,从目前的

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

更多细节,可以发现订阅报告;然而,我注意到在使用上面公布的“当前月份的最后一天”功能时,只要进程的月份具有与当前月份相同的天数,它就会工作。我已经经历了工作,并测试这些修改,并希望他们帮助在今后其他开发商:

日期公式:上月 查找第一天:

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

这一次会给你至今还没有时间:

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

这一次会给你日期时间:

=dateadd("m",-1,dateserial(year(Today),month(Today),1)) 
相关问题