我们正在为客户的SQL创建一个SQL报告查询,以便根据客户的协议每月、每季度或每两年发送一次生成的自定义SQL报告。
因此,当为变量@startDate
和@endDate
运行SQL报告时,需要动态计算日期范围,直到最后一秒的精度,例如:
上个月的报告:
@startDate: 2021-11-01 00:00:00.000
@endDate: 2021-11-30 23:59:59.000
上一季度报告:
@startDate: 2021-07-01 00:00:00.000
@endDate: 2021-09-30 23:59:59.000
不计算周期的最后一个瞬间,只使用半开区间。例如
@startDate: 2021-07-01
@endDate: 2021-10-01
然后
select . . .
where Dt >= @startDate
and Dt < @endDate
或
select . . .
where Dt >= @startDate
and Dt < dateadd(month,3,@startDate)
等等。
因此,在尝试了包括日历表在内的许多SQL查询模式后,这些简单的查询似乎效果最好:
-- First and Last Day of last month
SELECT DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 1, 0) AS 'Last month start date'
,DATEADD(ss, - 1, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)) AS 'End Date';
GO
-- First and Last Day of Quarter
SELECT DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) -1, 0) AS 'Last Quarter start datetime'
, DATEADD(second, -1, DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0)) AS 'Last Quarter start datetime';