SQL Server:周末为星期五,前一周为结束日期

时间:2016-08-04 02:54:34

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

我正在创建一份报告,报告上周,每周,每季度和每周的收入详情,所有这些都基于前一周的截止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

我该怎么做?

1 个答案:

答案 0 :(得分: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'

我更喜欢前者,但由于您明确地期待星期五,而不是特定于某一天的特定区域结束,所以您对后者感到满意。

其余的插入标准的第一个/最后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