【问题标题】:How to get the the date range of previous month or quarter for reporting in SQL Server down to the seconds [closed]如何将SQL Server中报告的上个月或上季度的日期范围缩小到秒[关闭]
【发布时间】:2022-01-08 11:14:36
【问题描述】:

我们正在为客户的 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

【问题讨论】:

标签: sql sql-server tsql date-range


【解决方案1】:

不用计算周期的最后一刻,只需使用半开区间。例如

@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)

等等

【讨论】:

    【解决方案2】:

    所以最后在尝试了很多 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';
    

    【讨论】:

    • 这不是一个博客平台。你对“最后一秒”的假设是不正确的。通常,您使用包含性的下边界(因为每个日期都从 00:00:00.000000 开始)和一个独占的上边界来避免基于列数据类型的准确性问题 - 但该问题不太可能出现。使用 datepart 的缩写而不是可读值是“不太理想”的 IMO。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多