【问题标题】:SQL Server : week end as Friday and prior week as end dateSQL Server:周末为周五,前一周为结束日期
【发布时间】:2016-12-10 00:17:15
【问题描述】:

我正在创建一个报告,报告前一周、逐月、逐季和总计的收入详细信息,所有这些都基于截至前一周的date

假设报告总是在星期五运行,计算/截止日期如下:

  • 报告运行日期:08-12-2016
  • 前一周:07-30-2016 直到 08-05-2016
  • 每月到每周:08-01-2016 直到 08-05-2016
  • 季度至今:季度开始日期从今天到08-05-2016

现在假设如果我在星期三 08-03-2016 运行此报告,那么它应该使用当前的周末作为 08-05-2015,然后返回一周。在这种情况下,截止日期将是 08-23-2016 直到 08-29-2016

我该怎么做?

【问题讨论】:

    标签: sql sql-server sql-server-2008 reporting-services


    【解决方案1】:

    上周五有两种锻炼方法,一种使用DATEFIRST,另一种使用第 0 天是星期一的巧合。

    DATEFIRST 设置为 6(星期六),然后计算上一个工作日结束:

    SET DATEFIRST 6
    SELECT CAST(DATEADD(DAY,  -DATEPART(WEEKDAY, GETDATE()), GETDATE()) AS DATE) 'Last Friday';
    

    或者查找最近一周的开始时间(星期一)并倒数三天:

    SELECT CAST(DATEADD(DAY, -3 , DATEADD(WEEK,DATEDIFF(WEEK,0,GETDATE()),0)) AS DATE) 'Last Friday'
    

    我更喜欢前者,但由于您要明确寻找星期五,而不是特定于区域设置的工作日结束,因此您可以接受后者。

    剩下的就是插入标准的 First/Last DATEADD/DATEDIFF 模式。这些应该可以满足您的需求:

    DECLARE @LastFriday DATE = DATEADD(DAY, -3 , DATEADD(WEEK,DATEDIFF(WEEK,0,GETDATE()),0));
    
    SELECT 
        LastFriday = @LastFriday, 
        PriorWeekStart = DATEADD(DAY, -6, @LastFriday),
        MonthStart = CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, @LastFriday), 0) AS DATE),
        QuarterStart = CAST(DATEADD(QUARTER, DATEDIFF(QUARTER, 0, @LastFriday), 0) AS DATE)
    
    LastFriday PriorWeekStart MonthStart QuarterStart
    ---------- -------------- ---------- ------------
    2016-07-29 2016-07-23     2016-07-01 2016-07-01
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多