アプリ版:「スタンプのみでお礼する」機能のリリースについて

SQL Server2005のクエリで「今週のデータ」を抽出したいのですがうまく出来ません。


between datename (weekday, getdate()) on datename(weekday, getdate() +6 )


「今週の」という条件は、本日の日付から週始めの月曜日を算出して、その値にプラス6をした日曜日までのデータを取得、という感じで行いたいのですが、
肝心の月曜日の求め方が分かりません。

参考書やネットを調べても分からなかったため、この場をお借りして質問させていただきました。

何卒ご教授お願いいたします。

A 回答 (1件)

曜日の算出を行うにはDATEPARTを使います。


DATEPART(dw,GETDATE())
これにより日曜日から土曜日までが1~7の数字で返ります。

それぞれの曜日の数字が返ってきたときに、何日動かせばその週の月曜日になるかを考えてください。
日 1 -6日
月 2  0日(そのまま採用)
火 3 -1日
水 4 -2日
木 5 -3日
金 6 -4日
土 7 -5日

よく見てみると、日曜日以外は返ってきた数字を2から引けば動かすべき日数になることがわかります。
(日曜日だけは特別です)
したがって、
CASE WHEN DATEPART(dw,GETDATE())=1 THEN DATEADD(d,-6,GETDATE()) ELSE DATEADD(d,2-DATEPART(dw,GETDATE()),GETDATE()) END
これでその週の月曜日が求まりますが、GETDATE()というのは時刻もついているので、検索対象のフィールドに時刻まで入っていないなら、このままでは月曜日の取引が全部拾われないことになります。
時刻部分を落とす最もシンプルな方法は一旦年月日の文字型にしてから日付型に戻すことです。
CONVERT(datetime,CONVERT(varchar,日付,111))

上記をまとめると
BETWEEN
CONVERT(datetime,CONVERT(varchar,
CASE WHEN DATEPART(dw,GETDATE())=1 THEN DATEADD(d,-6,GETDATE()) ELSE DATEADD(d,2-DATEPART(dw,GETDATE()),GETDATE()) END,111))
AND
DATEADD(d,6,CONVERT(datetime,CONVERT(varchar,
CASE WHEN DATEPART(dw,GETDATE())=1 THEN DATEADD(d,-6,GETDATE()) ELSE DATEADD(d,2-DATEPART(dw,GETDATE()),GETDATE()) END,111)))

となります。
逆にもし検索対象のフィールドが時刻も含まれているならば、6日足して日曜日を求めるのではなく、7日足して月曜日を求めて、日付>=週初の月曜日(時刻なし) AND 日付<次の月曜日(時刻なし)としてください。
    • good
    • 0
この回答へのお礼

ご丁寧に教えていただきありがとうございました。
無事抽出出来ました。

お礼日時:2010/06/03 21:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す