T-SQL 获取日期

T-SQL to get dates

我有 SSRS 销售报告,我需要将上个月的开始日期和结束日期传递到其中,我可以使用以下代码传递这些日期。但是,由于销售报告包含去年(2014 年)的数据,我还需要传递去年的日期。下面的代码将 StartDate1 指定为 2015-02-01,将 EndDate1 指定为 2015-02-28。我需要获取过去一年的日期,例如 2014-02-01 作为 StartDate2 和 2014-02-28 作为 EndDate2

SELECT  DATEADD(MONTH, DATEDIFF(MONTH, '19000201', GETDATE()), '19000101') AS StartDate1,
    DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '18991231') AS EndDate1

由于月份的最后一天可能会有所不同,重要的是获得今年当月的第一天。从中您可以计算出其他三个值。

您可以使用参数默认值中的表达式轻松地做到这一点。

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 像这样的语句:

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 日期时间 class 方法的内部参数。