2009-06-18 14 views
5

私は大学で働き、学生管理システムの学年開始日は8月1日以前の月曜日で決定されます。私はこれを照会の中で照合しなければなりません。この日以前の月曜日の日付を簡単に取得する方法はありますか?T-sql月曜日より前に

答えて

2
set datefirst 1; -- Make Monday the first day of the week 

select dateadd(dd, -1*(datepart(dw, '2009-08-01')-1), '2009-08-01') 

返します7月27日、2009年8月1日か前に、2005年に変更し、それを8月1日は月曜日だったとクエリが08-01

1

datepartを使用して平日を取得し、次にあなたの月曜日に戻って少し計算します。この例では、米国のデフォルトのdatefirst 7(月曜日が2日目)を使用しています。あなたのロケールの月曜日を指定する曜日を追加する日を調整します。

月曜日
select dateadd(dd, -datepart(dw, '2009-08-01') + 2, '2009-08-01') 
+0

次の理由で間違った結果が返されるので、これをマークしました。select dateadd(dd、-datepart(dw、 '2011-05-15')+ 2、 '2011 -05-15 ')。これは '2011-05-16'を返します。 –

0

非常にハックを返しますとき

DECLARE @weekday int 

SELECT @weekday = DATEPART(WEEKDAY, '1-Aug-2009') 

SELECT CASE 
WHEN @weekday = 1 THEN '1-Aug-2009' ELSE DATEADD (dd,(@weekday-2)*-1, '1-Aug-2009') 
END 
0

これは、任意の月(@inputdate)の最初の月曜日が返されます、一般的なアルゴリズムです:

DATEADD(wk, DATEDIFF(wk, 0, dateadd(dd, 6 - datepart(day, @inputDate), @inputDate)), 0) 

これは、SQL Serverで月の最初の月曜日を取得する一般的な方法です。このlinkは、上記の計算が他の多くの日付計算と一緒にどのように機能するかを説明しています。ここで

は、上記のアルゴリズムは上か月の1日前の月曜日を取得するために使用することができる方法である:私は必要なので

-- Set month to get Monday before or at 1st of month. 
DECLARE @inputDate DATETIME 
SET @inputDate = '2009-08-01' 

-- Get first Monday of month. 
DECLARE @firstMonday DATETIME 
SET @firstMonday = DATEADD(wk, DATEDIFF(wk, 0, dateadd(dd, 6 - datepart(day, @inputDate), @inputDate)), 0) 

-- Determine date for first Monday on or before 1st of month. 
DECLARE @startDate DATETIME 
SET @startDate = @firstMonday 
IF @firstMonday > @inputDate 
    SET @startDate = DATEADD(wk, -1, @firstMonday) 

SELECT @startDate 
4

が受け入れ答えは私のために動作しませんでした両方日曜日と月曜日の週に同じクエリを実行します。これは、異なるまたがっ作品 "DATEFIRST" の設定:

SELECT DATEADD(d, -((DATEPART(WEEKDAY, '20110515') - DATEPART(dw, '19000101') + 7) % 7), '20110515') 

"DATEPART(DW '19000101')は、" 1900年1月1日が月曜日にあったため設定あなたの "DATEFIRST" を決定します。火曜日を基準にした週が必要な場合は、19000101を19000102に変更できます。

BTW、 '20110515'は、すべてのSQL Serverのカルチャ設定で機能する唯一の日付形式です。 「2011-05-06」のような日付は、一部の国で誤解されます。 (これを指摘するためのItzik Ben-Ganへのクレジット)

+0

+1は、エレガントな、「datefirst」にとらわれないソリューションです。 –

+0

ニース、受け入れられる回答にする必要があります – nhaberl

関連する問題