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 方法的内部参数。
我有 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 方法的内部参数。