3

SQL Server2005Expressの使用。

(
    CONVERT(VARCHAR(8), R.reviewStart, 108) between CONVERT(VARCHAR(8), M.meetingStart, 108) and CONVERT(VARCHAR(8), M.meetingEnd, 108) OR
    CONVERT(VARCHAR(8), R.reviewEnd, 108) between CONVERT(VARCHAR(8), M.meetingStart, 108) and CONVERT(VARCHAR(8), M.meetingEnd, 108) OR
    CONVERT(VARCHAR(8), M.meetingStart, 108) between CONVERT(VARCHAR(8), R.reviewStart, 108) and CONVERT(VARCHAR(8), R.reviewEnd, 108) OR
    CONVERT(VARCHAR(8), M.meetingEnd, 108) between CONVERT(VARCHAR(8), R.reviewStart, 108) and CONVERT(VARCHAR(8), R.reviewEnd, 108)
)

日時がvarcharに変換された後も、「between」は期待どおりの動作をしますか?

ありがとう

4

3 に答える 3

2

はい、期待される動作の意味によって異なります。BETWEEN演算子は、これらのオペランドをvarcharとして扱い、それに応じて比較規則を適用します。

test_expressionの値がbegin_expressionの値以上で、end_expressionの値以下の場合、BETWEENはTRUEを返します。

これで、文字列を比較し、日付比較の動作を期待するなど、多くの潜在的な問題を確認できます。私のテストでは何も見ていませんが、あなたのデータを注意深く見てください。CONVERTは、適切な先行ゼロを使用して24時間制を返していますか?

この質問には、varcharsに変換する以外に、日付のない時間を比較するためのいくつかの他のアプローチがあります。

また、nullの日付に注意してください。これにより、対応するWHERE条件がfalse(実際には不明)を返します。

他の質問では、エラーが発生していることを示しました。もしそうなら、あなたはそれを投稿できますか?

于 2009-06-04T01:22:27.743 に答える
0

最初の条件は、このよりインデックスに適した条件と同等です。

R.reviewStart >=  DATEADD(day, DATEDIFF(day, '19010101', M.meetingStart), '19010101') 
and R.reviewStart < DATEADD(day, 1+DATEDIFF(day, '19010101', M.meetingStart), '19010101') 

(ここで説明: テーブル値 UDF でコードを再利用する ) .

于 2009-06-04T01:38:05.263 に答える
0

他の投稿で述べたように、可能な場合は、SQL 2008 への移行を検討する必要があります。これは、日付部分と時刻部分を明示的に分離できる新しい datetime 型があるためです。これにより、フィルター式がよりシンプルになり、時間でインデックスを付けることができます。Express であるため、2005 年に躊躇する理由はまったくないはずです。

于 2009-06-04T02:00:42.643 に答える