我有SSRS销售报告,我需要通过以下代码传递上个月的开始日期和结束日期的日期。但是,由于销售报告包含过去一年(2014年)的数据,我还需要传递去年的日期。以下代码将StartDate1作为2015-02-01,将EndDate1作为2015-02-28。我需要将2014年2月1日的日期作为StartDate2和2014-02-28作为EndDate2获取
SELECT DATEADD(MONTH, DATEDIFF(MONTH, '19000201', GETDATE()), '19000101') AS StartDate1,
DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '18991231') AS EndDate1
答案 0 :(得分:0)
由于月份的最后一天可能会有所不同,重要的是要获得今年当月的第一天。由此您可以计算其他三个值。
您可以使用参数的默认值中的表达式轻松完成此操作。
Start of Month
=Today.AddDays(1-Today.Day)
End of Month
=Today.AddDays(1-Today.Day).AddMonths(1).AddDays(-1)
Start of Month Last Year
=Today.AddDays(1-Today.Day).AddYears(-1)
End of Month Last Year:
=Today.AddDays(1-Today.Day).AddYears(-1).AddMonths(1).AddDays(-1)
但是如果你真的想在SQL中这样做,你可以。请注意下面我将描述如何获取月份的开头,然后在其他表达式中使用占位符变量以便清楚。
--Start of Month
dateadd(month, datediff(month, 0, getdate()), 0)
--End of Month
dateadd(day, -1, dateadd(month, 1, @StartOfMonth))
--Start of Month Last Year
dateadd(year, -1, @StartOfMonth)
--End of Month Last Year
dateadd(day, -1, dateadd(month, 1, @StartOfMonthLastYear))
这些是件。将它们组合成一个巨大的,非常难以阅读的选择语句如下:
select
dateadd(month, datediff(month, 0, getdate()), 0) StartDate1,
dateadd(day, -1, dateadd(month, 1, dateadd(month, datediff(month, 0, getdate()), 0))) EndDate1,
dateadd(year, -1, dateadd(month, datediff(month, 0, getdate()), 0)) StartDate2,
dateadd(day, -1, dateadd(month, 1, dateadd(year, -1, dateadd(month, datediff(month, 0, getdate()), 0)))) EndDate2
现在你明白为什么我建议只使用可以利用.NET datetime类方法的内部参数。