2012-12-05 7 views

答えて

15

少数の行しか持っていない場合は、DateFinishedが今年の今月のすべての行を取得します。

SELECT * 
FROM MyTable 
WHERE Year(DateFinished) = Year(CURRENT_TIMESTAMP) 
       AND Month(DateFinished) = Month(CURRENT_TIMESTAMP) 

これはしかし多数の行を超える非常に遅く得ることができます - その場合にDateAddDatePartBETWEENを使用して、私は書く時間がない(おそらく、より適切である、とインデックスを利用することができます今の人たちの答え!)

+0

月部分がオフですか? – Moose

+0

@Moose Thanks - まだ編集中です:-) – Bridge

+0

これは動作しますが、 'YEAR()'や 'MONTH()'を使用すると基本的にSQL Serverがインデックスを使用できなくなってしまいます。 OPがこれを頻繁に必要とする場合は、各行の月/年を保持している2つの**計算済み永続化**列を作成してそれらを照会すると便利です。 –

9

代わりに、これはDateFinishedのインデックスを使うべきです。

SELECT * 
FROM MyTable 
WHERE DateFinished BETWEEN 
    DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) 
    AND 
    DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0) 
+4

これは次の月の初めを含み、私は最後の行を作ることでこれを避けます:DATEADD(DAY、-1、DATEADD(MONTH、DATEDIFF(MONTH、0、GETDATE())+ 1、0)) – PCurd

+0

良いキャッチ、私は逃しました。 – Moose

関連する問題