2016-10-13 1 views
0

SQL Server 2008の場合:結果をフィルタリングし、特定の日付と同じ月にある結果のみを返す最良の方法は何ですか?datetimeを指定すると、その日時の月ごとに結果をフィルタリングします

-- set up test data 
DECLARE @TABLE1 AS TABLE (
    ID INT, 
    STRING VARCHAR(MAX), 
    DATECOLUMN DATETIME 
) 
INSERT INTO @TABLE1 
SELECT 
    0 ID, 
    'TABLE1 0' STRING, 
    CONVERT(DATETIME, '2016-10-13 12:45:00', 102) DATECOLUMN 
UNION ALL SELECT 1, 'TABLE1 1', CONVERT(DATETIME, '2016-9-13 12:45:00', 102) 
UNION ALL SELECT 2, 'TABLE1 2', CONVERT(DATETIME, '2016-10-1 00:00:00', 102) 
UNION ALL SELECT 3, 'TABLE1 3', CONVERT(DATETIME, '2016-10-31 23:59:59', 102) 

-- set up constraint 
DECLARE @SOMEDATE DATETIME = CONVERT(DATETIME, '2016-10-13 12:45:00', 102) 

-- filter 
SELECT * FROM @TABLE1 
WHERE MONTH(DATECOLUMN) = MONTH(@SOMEDATE) 

はこれが最善の方法です:

私が思い付くことができる最高のは、次のでしょうか?

+2

テーブルに異なる年のデータがある場合に誤検出を避けるには、同じ年にチェックする必要があります。 – Jayvee

答えて

1

あなたのクエリでは、の月と一致するレコードが返されますが、(@ Jayveeが指摘するように)これは年に関係なく真となります。だから、それがあなたの望むものなら、あなたの解決策は大丈夫です。

しかし、あなたはそれが最善の解決策であるかどうか尋ねました。私はnoと言うでしょう。これはあなたが持っている可能性のあるインデックスを利用しないので、DateColumnです。

私はSQL Server 2008でいたのであれば、これは、私がどうなるのかです:私は、終了日を開始日のため>=が、<を言っ

declare @someDate datetime = GetDate() 
declare @startDate date 
declare @endDate date 

-- I want the first day of the month, at 12:00:00AM (no time component). 
-- The DateAdd expression subtracts days, and converting to the Date data type 
-- ensures that I don't have a time component hanging around. 
set @startDate = convert(date, DateAdd(day,- DatePart(day, @someDate) + 1, @someDate)) 

-- I want the first day of the next month. This is easy: 
set @endDate = DateAdd(month, 1, @startDate) 

-- Here's my actual query, that can take advantage of indexes that include DateColumn: 
select * 
from Table1 
where DateColumn >= @startDate and DateColumn < @endDate 

注意。これにより、月の最後の日に、ゼロ以外の時間コンポーネントがあるが次の月には入り込まない日付エントリを取得できるようになります。

0

長期的なソリューションの最良の方法は、日付ディメンションテーブルを作成することです(そこにスクリプトを自動生成するスクリプトがあります)。日付dimテーブルには、DayOfWeek、QuarterOfYear、YYYYMMなどの列が含まれているので、CAST(YOURDATE AS DATE)に日付のdim nifty date情報をプルします。ここでは、両方のテーブルを日付dimに結合し、WHERE t1.YYYYMM = t2.YYYYMMを使用することができます。

関連する問題