2016-10-05 8 views
0

日付の明確な数を取得する代わりに何が、9月のすべての日付を言う:where句に値のリストを適用するときのカーソルの代わりに?

9/1/2016 
9/2/2016 
9/3/2016 

をし、クエリにそれぞれの値を適用します。次のように言ってください:

Select GuitarId,GuitarBrand 
From GuitarSales 
Where GuitarDate = @date 

私はカーソルを使用したくありませんが、これに代わる方法はありますか?

私はCTEを試みましたが、それでも各日付のカーソルを適用する必要がありました。

+0

ルックアップ/テンポラリテーブル。好ましくは両方のテーブルにインデックスを付ける。 – Beth

+1

'GuitarDate in(select date from ...)'どこですか? – Blorgbeard

+0

あなたはどのデータベースを使用していますか – scaisEdge

答えて

4

あなたは月のすべての日付をしたい場合は、私が正しくあなたを理解していれば、あなたは9月のすべての日付のリストを必要とする

Select GuitarId,GuitarBrand 
From GuitarSales 
Where month(GuitarDate) = 9 
and year(GuitarDate) = 2016; 
+0

しかし、年を忘れないでください:-) – Shnugo

+0

@ Shnugo正解は更新されました..ありがとう – scaisEdge

+0

これについて行く最も効率的な方法ではありません。 SARGable述語は索引を利用できるようになります。 –

2

を使用することができます。これは、9月のすべての日のgaplessリストを取得する迅速なソリューションです:あなたのクエリでは、これをソースとして使用し、LEFT JOINあなたの実際のデータを使用することができます。

WITH RunningNumbers AS 
(
    SELECT TOP(30) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1 AS Nr 
    FROM sys.objects 
) 
SELECT {d'2016-09-01'}+Nr AS RunningDate 
FROM RunningNumbers 

は、あなたがその場で集計テーブルを作成することができますどのように多くの例があります。小さな数字(この例では30)は、十分な行を持つテーブルから簡単に取得できます。

あなたは、これはより頻繁にあなたが番号 - 表を考えるかもしれませんが必要な場合

0

ここでGuitarDateにインデックスがあると仮定すると、ここでは、インデックス検索を使用する速度を引き続き利用できるように、述部があるSARGableを作成する方法があります。

declare @date datetime = '2016-09-10' --just to demonstrate starting with September 10, 2016 

select gs.GuitarId 
    , gs.GuitarBrand 
From GuitarSales gs 
where gs.GuitarDate >= dateadd(month, datediff(month, 0, @date), 0) --beginning of the month for @date 
    and gs.GuitarDate < dateadd(month, datediff(month, 0, @date) + 1, 0) --beginning of next month 
関連する問題