在 SQL Server Reporting Services (VB.Net) 中查找上一个日历月的第一天和最后一天
Posted
技术标签:
【中文标题】在 SQL Server Reporting Services (VB.Net) 中查找上一个日历月的第一天和最后一天【英文标题】:Find first and last day for previous calendar month in SQL Server Reporting Services (VB.Net) 【发布时间】:2011-01-04 19:44:51 【问题描述】:我正在 MS SQL Server Reporting Services 中创建报告,需要将默认的开始和结束日期报告参数设置为上一个日历月的第一个和最后一个日期,需要帮助。
报告在每月的第二个日历日生成,我需要以下值:
上一个日历月 - 第一天 - 最后一天
我一直在使用 DateAdd,但未能成功创建表达式(在 VB.NET 中,据我了解)。如果您能给我任何帮助,我将不胜感激!
【问题讨论】:
【参考方案1】:这些功能对我很有帮助——尤其是在设置订阅报告方面;但是,我注意到在使用上面发布的当月最后一天功能时,只要下一个月的天数与当月相同,它就可以工作。我已经完成并测试了这些修改,并希望它们将来能帮助其他开发人员:
日期公式: 查找上个月的第一天:
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】:这个不会给你约会的时间:
=FormatDateTime(DateAdd("m", -1, DateSerial(Year(Today()), Month(Today()), 1)),
DateFormat.ShortDate)
这个会给你日期时间:
=dateadd("m",-1,dateserial(year(Today),month(Today),1))
【讨论】:
【参考方案3】:Randall,以下是我发现在 s-s-rS 中工作的 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 说明该函数接受 year
、month
和 day
参数的预期范围之外的值。这允许您指定有用的日期相关值。例如,Day
的值为 0 表示“上个月的最后一天”。这是有道理的:那是当月第 1 天的前一天。
【讨论】:
本月最后一天和下个月最后一天不正确;两者都假设未来几个月的天数与前一个月相同。有关在 s-s-rS 表达式中执行此操作的更好方法,请参阅@Stephanie Grice 的答案。【参考方案4】:我一直在寻找一个简单的答案来自己解决这个问题。这是我发现的
这将年月分开,休息一个月,得到第一天。
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
【讨论】:
【参考方案5】:我在将实际 VB.NET 转换为 s-s-rS 使用的表达式子集时遇到了一些困难。不过,你确实启发了我,这就是我想出的。
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】: 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
【讨论】:
【参考方案7】:我不熟悉 s-s-rS,但是你可以在 VB.Net 中使用DateTime
构造函数获取上个月的开始和结束,如下所示:
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#
)
【讨论】:
【参考方案8】: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 用于将“参考日期”存储在变量中,这消除了计算第一天和最后一天之间存在一个月偏移的(不太可能,但可能)情况。 我在生产中没有看到过这种情况,但正是由于这个原因,我看到了一个损坏的计划构建。 :)【参考方案9】:在 C# 中:
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-1)
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1)
【讨论】:
您可以将new
更改为New
并称之为VB.NET以上是关于在 SQL Server Reporting Services (VB.Net) 中查找上一个日历月的第一天和最后一天的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server Reporting Services 在聚合数据上运行总计
在生产箱上部署 Sql Server Reporting Services 报告
解决Sql Server Reporting Service在Chrome下无法显示的问题
向 SQL Server Reporting Services 报表添加交替行颜色