私が知る限り、時間部分から日付部分を抽出するために、日付に対して一連の変換を行っています。もっと速くて簡単な方法があります。ここで使用する 1 つの方法は次のとおりです。
DateAdd( d, DateDiff( d, 0, SomeDateValue ), 0 )
これは、日付 0 (1900-01-01) の間の日数を検出し、そのSomeDateValue
日数を日付 0 に追加して、時刻部分がゼロの日付値を生成します。したがって、あなたが提示したものを考えると、1つの解決策は次のようになります。
Select Distinct DateAdd( d, DateDiff( d, 0, C.Entered ), 0 ) As [Date]
From customer As C
Where (
C.Entered >= DateAdd( d, DateDiff( d, 0, @DateRangeFrom ), 0 )
And
C.Entered < DateAdd( d, DateDiff( d, 0, @DateRangeTo ), 1 )
)
Or ( @DateRangeFrom Is Null And @DateRangeTo Is Null )
このソリューションでは、代わりに>=
andを使用して、値に余分な日を追加し、この終点より厳密に小さいすべての値を見つけることができるようにしました。これにより、時間部分が経過した場合、その日の までのすべての値を使用することが保証されます。2 つのパラメーターを常にゼロの時間値で渡すことがわかっている場合は、次のようにクエリを簡略化できます。<
Between
@DateRangeTo
@DateRangeTo
11:59:59
Select Distinct DateAdd( d, DateDiff( d, 0, C.Entered ), 0 ) As [Date]
From customer As C
Where (
C.Entered >= @DateRangeFrom
And
C.Entered < DateAdd( d, 1, @DateRangeTo )
)
Or ( @DateRangeFrom Is Null And @DateRangeTo Is Null )
さらに、何らかの理由で、@DateRangeFrom
と@DateRangeTo
を空の文字列と比較していました。これらが本来DateTime
あるべきように入力されていると仮定すると、その必要はありません。渡された値が null かどうかを確認するだけです。
最後に、結果の Select ステートメントのいずれかで、常にConvert
出力に対してのみ関数を使用できます。
Select Distinct Convert(varchar(10), DateAdd( d, DateDiff(d, 0, C.Entered), 0), 103)