2016-08-04 129 views
0

我正在創建一個報告,報告上週,每月到每週,每週到每週和總計的收入明細,全部基於截止前一週的dateSQL Server:週末以週五和上週末爲結束日期

假設該報告將始終在星期五運行,計算/截止日期將是如下:

  • 報告運行日期: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

有兩種方法可以解決上週五,一個使用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