2012-09-14 121 views
17

我需要正確的語法給我:上週一和上週日日期起計算

  1. 前週週一日期基於基於當前日期/使用GETDATE()
  2. 前週週日日期時間使用GETDATE()

因此,基於今天的日期當前日期/時間(14/09/2012)我想以下幾點:

  1. 上一頁星期一日期= 03/09/2012
  2. 上一頁週日日期= 2012年9月9日
+1

10日星期一不是最後一個星期一?你在尋找前一週的星期一嗎? –

+0

爲什麼你最後一個星期一不是'10/09/2012'? –

+0

對不起,我正在分類,因爲這個星期一(在本週)是的,前幾周星期一將是一個更好的短語 – JsonStatham

回答

31

容易:

--start of last week 
SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) 

--end of last week 
SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 6) 

EDIT

下將處理週日日期問題。

DECLARE @input varchar(10) 
--SET @input = '9/9/2012' -- simulates a Sunday 
SET @input = GETDATE() 

--start of last week 
SELECT DATEADD(wk, DATEDIFF(wk, 6, 
CASE DATEPART(dw,@input) 
WHEN 1 THEN DATEADD(d,-1,@input) 
ELSE @input 
END 
), 0) 

--end of last week 
SELECT DATEADD(wk, DATEDIFF(wk, 6, 
CASE DATEPART(dw,@input) 
WHEN 1 THEN DATEADD(d,-1,@input) 
ELSE @input 
END 
), 6) 
+0

這與@NikolaMarkovinović在上面提到的相同。 –

+0

+1將日偏移納入基準計算。 –

+0

根據@NikolaMarkovinović在上述評論中建議的修正添加了代碼。 –

8

如果不使用的情況下選擇的,你也可以這樣做是爲了得到當前一週的週日:

SELECT DATEADD(dd, DATEPART(DW,GETDATE())*-1+1, GETDATE()) 

要獲得前一週的週日,減去7天以上:

SELECT DATEADD(dd, DATEPART(DW,GETDATE())*-1-6, GETDATE()) 
+0

如果@@ datefirst = 7(默認)第一個星期天給我(除非你從星期天開始計算星期...然後它是可以的,但是那麼整個case選項也是沒有問題的) – robotik

3

我認爲這是更清潔的解決方案:

SELECT 
    -- 17530101 or 1753-01-01 is the minimum date in SQL Server 
    DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE())/7) * 7) - 7, '17530101') AS [LowerLimit], -- Last Week's Monday 
    DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE())/7) * 7) - 1, '17530101') AS [UpperLimit] -- Last Week's Sunday. 

可以在一個真實的世界查詢中使用這樣的:

SELECT 
    * 
FROM 
    SomeTable 
WHERE 
    SomeTable.[Date] >= DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE())/7) * 7) - 7, '17530101') AND 
    SomeTable.[Date] <= DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE())/7) * 7) - 1, '17530101') 

下面是一些測試:

1.閏年

當前日期:2016-02-29 00:00:00.000

結果:

LowerLimit     UpperLimit 
2016-02-22 00:00:00.000 2016-02-28 00:00:00.000 

2.上週在不同的年份

當前日期:2016-01-06 00:00:00.000

LowerLimit     UpperLimit 
2015-12-28 00:00:00.000 2016-01-03 00:00:00.000 

3.比上月和上限下限當月

當前日期:2016-05-04 00:00:00.000

LowerLimit     UpperLimit 
2016-04-25 00:00:00.000 2016-05-01 00:00:00.000 

4。當前日期是星期天

當前日期:2016-05-08 00:00:00.000

LowerLimit     UpperLimit 
2016-04-25 00:00:00.000 2016-05-01 00:00:00.000 
+1

這是(儘管下限顯示的是前一週的週一,而不是OP請求的當周的週一),其他解決方案受到'星期日問題'的影響, – Gallus

2

更妙的是,我認爲,這適用於任何時間,任何一週的一天,任何DATEFIRST參數(設置一週的第一天,通常法國1週一,默認爲7日週日)。

create function [dbo].[previousWeekDayDate](@anyDate date, @anyWeekDay int) 
returns Date 
as 
begin 
    return DATEADD(dd, ((DATEPART(dw,@anyDate) + @@DateFirst - @anyWeekDay + 13) % 7) * -1, @anyDate) 
end 

作品SQL 2008,創建功能與用途:

SELECT dbo.previousWeekDayDate(GetDate(),1) --for Monday 
SELECT dbo.previousWeekDayDate(GetDate(),7) --for Sunday 
+0

爲什麼+13雖然?+6或-1更乾淨,更短,並且運作良好。無論如何,將@@ datefirst合併到equision – robotik

0

應當指出的是,週日的問題似乎不再存在至少爲MSSQL 2012年無論是簡單的溶液

SELECT DATEADD(wk, DATEDIFF(wk, 6, @input), 0) 

和複雜的一個

SELECT DATEADD(wk, DATEDIFF(wk, 6, 
CASE DATEPART(dw,@input) 
WHEN 1 THEN DATEADD(d,-1,@input) 
ELSE @input 
END 
), 0) 

對於我試過的任何日期(包括星期日)都會返回相同的結果。