2016-08-24 6 views
1

私はテーブルstartdateenddateの2つの列を持っており、関数を作成する必要がありますすべての関数を渡す日付データの間にあるIDを取得する必要があります。 私の関数の入力パラメータは、月がnullであれば、今月と年が2つの日付の間にあるかどうかを確認する方法

@Year int, 
@Month int = null, 
@Quarter int = null 

は、私が唯一のは簡単ですが、月がチェックするためにどのように提供されている場合、それは私が提供されstartdateenddateか、他の場合@Quarterの間にある場合は、日付をチェックする必要があります年の3か月がstartdateenddateと衝突するかどうかを確認する必要があります。私は今件まで書かれている何

CREATE FUNCTION GetAssociatesEmpID(
    @Year int, 
    @Month int = null, 
    @Quarter int = null 
) 
RETURNS TABLE 
AS BEGIN 
IF @Month IS NOT NULL -- Monthly Statistics 
    BEGIN 

    END 
ELSE IF @Quarter IS NOT NULL -- Quarterly Statistics 
    BEGIN 

    END 
ELSE -- Yearly Statistics 
    BEGIN 
     return SELECT ID FROM Table WHRER @Year>=YEAR(startdate) AND @Year<=YEAR(enddate) 
    END 
END 

が親切月と四半期との条件で私を助けている

四半期は4可能inutsは、その月の範囲が@Quarter*3-3との間にある 1-4間および範囲にあり@Quarter*3

+1

'YEAR(@Year)' doesn何らかの意味がある、「@年」はすでに「INT」 – Lamak

+0

@Lamak oh mybad指してくれてありがとう – user3452098

+0

2016年1月は2016-01-30と2016-02-02の間ですか? –

答えて

0

ないところ私がテストすることができますが、これは近いはず...

WHERE 
    (@Year >= YEAR(startdate)) 
    AND 
    (@Year <= YEAR(startdate)) 
    AND 
    (
     ((@Month IS NOT NULL) AND (@Month >= MONTH(startdate)) AND (@Month <= MONTH(startdate))) 
     OR 
     ((@Month IS NULL) AND (@Quarter >= DATEPART(QUARTER, startdate)) AND (@Quarter <= DATEPART(QUARTER, startdate))) 
    ) 
0

まず、2つのローカルDateTime変数を作成します。 (またはDateTime2、またはテーブルの開始日と終了日の列で使用されているデータ型に関係なく)@WhereStartDateと@WhereEndDateと呼ぶことがあります。

いくつかのIF文を使用して、新しい@WherexxxDate変数を設定します。月が提供される場合、例えば、のようなもの:あなたは実際の日付/時刻変数を持っていたら

DECLARE @Year int = 2016; 
DECLARE @Month int = 3; 
DECLARE @WhereStartDate datetime; 
DECLARE @WhereEndDate datetime; 

SET @WhereStartDate = CONVERT(datetime, CAST(@Year as char(4)) + '/' + CAST(@Month as varchar(2)) + '/01'); 
SET @WhereEndDate = DATEADD(day, -1, DATEADD(month, 1, @WhereStartDate)); 

SELECT @WhereStartDate, @WhereEndDate; 

は、あなたが適切なクエリを書くことができます...

SELECT ... 
... 
WHERE startDate >= @WhereStartDate 
AND enddate <= @WhereEndDate 

これがあることの追加の利点を持っていますsargable。あなたがあなたの質問を書いたやり方は、賢明ではありません。テーブルが大きい場合、結果として得られるテーブルスキャンに非常に時間がかかることがあります。

関連する問題