1

SQL に問題があります。問題は、テーブルからの結果データが、パラメーターに入力したものと同じではないことです。私のコードの何が問題なのかを確認できますか?.

これは私のコードです:-

select distinct  convert(varchar(10),a.entered,103) as
daterange  from customer
where
((a.entered BETWEEN convert(varchar(10),&daterangefrom,103) AND convert(varchar(10),&daterangeto,103)) or (convert(varchar(10),&daterangefrom,103) =' ' AND convert(varchar(10),&daterangeto,103) =' '))
4

3 に答える 3

1

私が知る限り、時間部分から日付部分を抽出するために、日付に対して一連の変換を行っています。もっと速くて簡単な方法があります。ここで使用する 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@DateRangeTo11: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)
于 2012-05-03T06:03:03.150 に答える