2012-09-14 31 views
17

とデート私は私を与えるために正しい構文を必要とする:現在の日付/時刻に基づいて前の月曜日&前の日曜日の日付が

  1. 前の週月曜日の日付GETDATE()
  2. 前の週の日曜日の日付を使用することに基づいて今日の日付(14/09/2012)に基づいて、だから、GETDATE()

を使用して、日付/時刻現在、私は次のことを望む:

  1. 前の月曜日= 2012年3月9日
  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

下記の意志日曜日の日付の問題を処理します。 7日以上、

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

は、前の週の日曜日を取得するには引く:

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-6, GETDATE()) 
+0

@@ datefirst = 7(デフォルト)の場合、最初の日曜日に前週の日曜日が表示されます(日曜日から始まる週をカウントしない限り...それで大丈夫ですが、大文字小文字のオプションも問題ありません)。 – 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をequasion – 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) 

は、日曜日を含め、私が試した任意の日付について同じものを返します。

関連する問題