2016-11-23 147 views
0

我在查找是否有一種方法可以計算出本週的日期範圍。計算本週日期範圍

例如

Monday - 2016-11-21 
Tuesday - 2016-11-22 
Wednesday - 2016-11-23 

等等的等等。

如果有人可以幫助我的語法和計算,將是偉大的。

+0

請記住「一週」有多個定義。根據您的需要,您可能需要牢記這一點。 – Jens

+0

你好Jens,你是什麼意思?如果我能避免將來的問題,我會想。 – user3482471

+1

根據地區的不同,一週定義的方式可能會發生變化。在一些地區,週一開始,週日開始。同樣每年處理數週,這些實施可能會有所不同,尤其是在一年的開始和結束時。第一週不一定從一月一號開始,它甚至可能仍然是去年一週的一部分。這是一個很常見的BI問題。 – Jens

回答

3

如果你對自己的專欄感到滿意,那麼你可以這樣做;

SELECT 
DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) Last_Monday 
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 1) Last_Tuesday 
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 2) Last_Wednesday 
,DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 3) Last_Thursday 

結果;

Last_Monday    Last_Tuesday   Last_Wednesday   Last_Thursday 
2016-11-14 00:00:00.000 2016-11-15 00:00:00.000 2016-11-16 00:00:00.000 2016-11-17 00:00:00.000 

如果你需要它的行然後就聯盟的結果;

SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) Date_Field, 'Last_Monday' Day_Name 
UNION 
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 1), 'Last_Tuesday' 
UNION 
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 2), 'Last_Wednesday' 
UNION 
SELECT DATEADD(WEEK, DATEDIFF(WEEK, 2, GETDATE()) - 1, 3), 'Last_Thursday' 

結果;

Date_Field     Day_Name 
2016-11-14 00:00:00.000  Last_Monday 
2016-11-15 00:00:00.000  Last_Tuesday 
2016-11-16 00:00:00.000  Last_Wednesday 
2016-11-17 00:00:00.000  Last_Thursday 

請仔細閱讀此處,以便了解其工作原理的最佳解釋;

DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) Can someone explain me this

+0

嗨Rich,這是一個正確的對待。我可以用它來滿足我的需求。可能聽起來像一個愚蠢的問題......但你可以分解它,這樣我就可以理解爲什麼這個工作? – user3482471

+0

我剛剛鏈接了一篇文章,對其進行了很好的解釋,請告訴我,如果這不能爲您解決這個問題。 –

0
DECLARE @StartDT DATE = '2016-11-21' 

;WITH CTE (_Date) 
AS (
    SELECT @StartDT 

    UNION ALL 

    SELECT DATEADD(DAY, 1, _Date) 
    FROM CTE 
    WHERE _Date < DATEADD(DAY, 6, @StartDT) 
    ) 
SELECT _Date 
    ,DATENAME(W, _Date) 
FROM CTE 
+0

雖然這段代碼可以解決這個問題,但[包括一個解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)這個問題是如何以及爲什麼會解決這個問題的有助於提高您的帖子的質量。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 – Makyen

0

您可以設置起點和一週的結束日期和重複槽那些日期:

Declare @startDay datetime, 
     @endDay  datetime, 
     @iterDate datetime 

Set @startDay = dateadd(day, datediff(day, 0, getdate())/7 * 7, 0) --Starting day of this week 
Set @endDay = dateadd(day, 7, @startDay) 

Set @iterDate = @startDay 

Declare @tmpResults Table (Date datetime, DayName varchar(20)) 

While (@iterDate < @endDay) 

Begin 
    Insert into @tmpResults (Date, DayName) 
    Values (@iterDate, datename(weekday, @iterDate)) 

    Set @iterDate = dateadd(day, 1, @iterDate) 
End 

select Date, DayName From @tmpResults 

結果:

enter image description here