• ベストアンサー

SQL Server2005のクエリで「今週のデータ」を抽出したいので

SQL Server2005のクエリで「今週のデータ」を抽出したいのですがうまく出来ません。 between datename (weekday, getdate()) on datename(weekday, getdate() +6 ) 「今週の」という条件は、本日の日付から週始めの月曜日を算出して、その値にプラス6をした日曜日までのデータを取得、という感じで行いたいのですが、 肝心の月曜日の求め方が分かりません。 参考書やネットを調べても分からなかったため、この場をお借りして質問させていただきました。 何卒ご教授お願いいたします。

noname#142623
noname#142623

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.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 日付<次の月曜日(時刻なし)としてください。

noname#142623
質問者

お礼

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

関連するQ&A

  • Access クエリのデータ型について

    AccessでPablic変数を日付範囲指定、クエリの抽出条件に指定したのですが、「抽出条件でデータ型が一致しません。」とのエラーメッセージで抽出出来ません。 【処理フロー】 1.フォームで、開始日と終了日をPublic変数へ格納 2.データ抽出クエリの日付条件に"GetData()"Public Functin VBAで変数を格納した値をクエリの抽出条件に返す。 《変数》 '開始日の宣言 Public sDate As Date '終了日の宣言 Public eDate As Date 《GetData()》 Public Function GetDate() MsgBox "開始日は、" & sDate & vbCrLf & "終了日は、" & eDate GetDate = ">=#" & sDate & "# And <=#" & eDate & "#" MsgBox ("Where文は、" & GetDate) End Function デバッグの為、"GetDate()"の戻り値を、メッセージボックスで表示してますが、戻り値は正常とおもわれますが、「抽出条件でデータ型が一致しません。」でクエリが実行できません。 ここを参考に、上記仕様にしました。 http://www.tsware.jp/tips/tips_369.htm どうすれば、日付範囲をPablic変数から指定出来るか、お教え頂けましたら幸いです。 ちなみに、Pablic変数にしているのは、他のクエリでもこの日付範囲を使いたい為です。 もし、ほかに良い処理方法が有れば、ご教授ください。

  • Access 抽出クエリーについての条件

    先の投稿に重複しますが、 それぞれ異なるテーブルについて、 クエリーで、、 Between #5:00# And #19:00# Between 500 And 1900 上記の方法等で同じ数値ではなく、 期間に幅をもたせて一致としそれぞれの 一致データを抽出するクエリーは つくれますか? もちろん抽出対象のテーブル、列はそれぞれ同じ書式です。 > between関数を使って、 フィールドのデータ型が日付/時刻型の場合 抽出条件欄に、 > 5:00から19:00を抽出したい、 Between #5:00# And #19:00# > 5:00から25:00を抽出したい、 Between #5:00# And #23:59# OR Between #0:00# And #1:00# Access の日付/時刻型では、25:00 というような表現はできないので、上記のように分割することになります。 > また上記がテキストだった場合も、 > 500から1900を抽出したい フィールドがテキスト型の場合、テキスト比較になり数値比較とは異なる抽出結果になるので、 フィールドに Val([テキスト型フィールド]) と式を設定して数値型に変換します。このの抽出条件に、 Between 500 And 1900 と設定します。 通報する

  • Access2000:クエリに値(抽出条件値)を返す

    クエリに抽出条件として、 Between [いつから?(例:200504)] And [いつまで?(例:200504)] と指定してあります。 マクロに登録されたクエリを実行すると必要パラメータとしてダイアログがたちあがるものです。 これを自動的にVBAで日付を算出し、上記クエリに値を返すことをしたいのですが記述方法がわかりません。 VBAで作成した関数の戻り値を上記クエリの抽出条件の欄に返す方法はありますか? よろしくお願いいたします。

  • ODBC SQLサーバーでSQLを使いたい・・・

    ODBC SQLサーバーでSQLを使いたい・・・ SET NOCOUNT ON DECLARE @EDATE DATETIME DECLARE @CUNT INT SET @COUNT = 0 WHILE ( @I <> -7 ) BEGIN IF ( DATANAME( WEEKDAY, DATEADD( DD, -1, GETDATE()))) = "金曜" BREAK ELSE SELECT @CUNT = @CUNT + 1 END SET @EDATE = CONVERT( CHAR, CONVERT( VARCHAR, DATEADD(DD, @COUNT, GETDATE()), 112) SELECT @EDATE 実行日からさかのぼり、金曜日の日付を表示したいSQLを作成しています。 なぜか"金曜"がおかしいとエラーが出てしまいます。 どなたかわかる方いましたらご教授お願い致します。

  • クエリでの抽出条件について

    クエリでの抽出条件について クエリで納品がまだ済んでいない物件について、抽出期間を設定して抽出したいのですが、うまくいかず教えてください。 抽出したいフィールドは、[納品日]、[部署]、[変更]の三つです。 フィールド[変更]は、[納品日]が変更になることがあるので、[納品日変更]というフィールドに日付が入っていたら、[変更]に[納品日変更]の日付が入るように、[納品日変更]に何も入っていなかったら、[変更]に[納品日]の日付が入るように、判定式を入れています。 [変更]の動作は、目的通りになっており問題無いのですが、いざ[納品日]、[部署]、[変更]で抽出条件を入れるとうまくいきません。 抽出条件の所に [納品日]には、Is Null [部署]には、抽出したい部署名 [変更]には、Between #2010/04/01# And #2010/05/31# それぞれAndで組んで入れていますが、何も抽出されません。 [納品日]の、Is Null と [部署]の、抽出したい部署名 のふたつだけでやると、[納品日][部署]での抽出は動作します。 しかし、この二つに[変更]をプラスし、期間を追加するとダメなようです。 [変更]のように、判定式で作ったフィールドは、抽出条件に使ってはいけないのでしょうか? それとも抽出条件のAndは二つまでとか制限があるのでしょうか? 全く別の基本的な問題が原因だと思うのですが、教えて頂きたく。

  • クエリーの抽出条件について

    「作表条件」というフォームにテキストボックスとして「日付1」、「日付2」を設置しています。 元のテーブルには「日付」という項目があり、「日付1」から「日付2」までのデータを抽出するため、 クエリの条件式に Between Nz([Forms]![作表条件]![日付1],#1800/01/01#) And Nz([Forms]![作表条件]![日付2],#9999/12/31#) と記述しています。 ただ、元のテーブルの日付がNULL値の場合があり、その場合「日付1」および「日付2」が空欄だとNULL値のレコードが抽出されません。 「日付」がNULLの場合でも抽出できるようにするには、どのようにすればよいでしょうか? どなたか教えてください。

  • 今週の日曜日から土曜日までの要素の抽出

    次のようなテーブルがあります。 info{ name varchar(50) release date } 今週の日曜日(6/21)から土曜日(6/27)までの要素を抽出するため 次のようなSQL文を実行しました。 SELECT name FROM info WHERE release BETWEEN DATE_SUB( DATE(NOW()), INTERVAL DATE_FORMAT(NOW(), '%W') DAY ) and DATE_ADD( DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY ) この構文でエラーがでてしまいます。 BETWEENのand前後の指定は間違っていないと思うのですが どこが悪いのかわかりません。 ご教授願います。

    • ベストアンサー
    • MySQL
  • ユニオンクエリで期間指定抽出のSQL記述について

    いつもお世話になっております。 Access 2007で、「人名集計」テーブルと「資料送付」テーブルがあり、それぞれ、同一のフィールド名でテーブルが作成されております。 これを「発送日」フィールドの昇順で並べ替えながら結合するユニオンクエリを作成しました。 SELECT * FROM 人名集計 UNION ALL SELECT * FROM 資料送付 ORDER BY 発送日; とりあえず、上記のSQLでは動いていますが、このSQLに、 「発送日」の期間を指定して、抽出条件(パラメータ)を加えようとしていますが、うまくいきません。 WHERE句を使って、Between 「最初の日付を入力」 And 「最後の日付を入力」 のような文を SQLの何処にどのように記述すればよいのか、教えてください。 宜しくお願い申し上げます。

  • SQLサーバにある日付型のデータから特定の曜日を抽出する方法は?

    SQLサーバに日付と料金の入ったテーブルがあります。 例えば、下のようなデータがあるとします。 日付            料金 2005/11/08 11:15:00  5000円 2005/11/09 12:00:00  6000円 2005/11/15 15:15:00  4000円 2005/11/16 09:00:00  7000円 このテーブルから火曜日のデータだけを抽出したい場合、 どのようなSQL文を書けばよいのでしょうか? どうぞ、よろしくお願いしますm(_ _)m

  • SQLサーバのデータをエクセルに抽出するには?

    お世話になっております。 表題の件につきまして、ご教授下さい。 SQLサーバのデータを、エクセルに出力するにはどのようにしたらよいかわからずに困っております。 アクセスのデータをエクセルに抽出する時に使用している、MSクエリ及びODBCの設定をちゃんとおこなえば、抽出する事はできると思うのですが、設定が 誤っている為、”ODBC-対象のデータへの接続が 失敗しました”と表示されなんの進展もない状況が続いております。 ちなみに環境としては、以下のような状態です。 (1)SQLサーバは、通常使用しておりますPCとは 別のネットワークに存在しております。 お忙しいところ申訳ありませんが、宜しくお願い致します。