0

請求を行うために在庫項目が完了した月に基づいて結果をフィルター処理する必要がある SQL データベースがあります。

私が扱っているフィールドは CompletionDate と呼ばれます。これが私が使用しているコードです。

input name='criteria' type='hidden' value="WHERE CompletionDate BETWEEN '8-1-2013' AND '8-31-2013'"

一部のレコードが返されますが、すべてではありません。問題は CompletionDate フィールドの形式にあると思われます。現在は varchar(10) です。このフィールドのデータを MM-DD-YYYY の形式で保存しています。

いくつかの検索の後、フィールドが varchar データ型であるため、上記のコードが希望どおりに機能しないことがわかりました。私はこれを無駄にしようとしました。

input name='criteria' type='hidden' value="WHERE to_date(CompletionDate, 'mm-dd-yyyy') BETWEEN to_date('8-1-2013', 'mm-dd-yyyy') AND to_date('8-31-2013', 'mm-dd-yyyy')"

誰でも解決策を教えてもらえますか?

4

2 に答える 2

0

フィールドは varchar 型であるため、日付範囲ではなく、実際にはテキスト範囲を検索しています。日付範囲クエリを簡単かつ効率的に実行できるため、日付は日付型フィールドに格納する必要があります。

to_date を使用した回避策は理論的には機能するはずですが、比較を行うためにデータベースが各行のテキストを実際の日付に変換しようとする必要があるため、かなり非効率的です。なぜそれが実際に機能しないのかについては、まだ不明です。どのデータベースを使用していますか? フォーマット文字列は正しいですか、それとも大文字にする必要がありますか ('MM-DD-YYYY')?

データベースに日付をテキストとして格納することに頑固な場合は、語彙的にソートできる形式 (先行ゼロを含む YYYY-MM-DD (2013-08-01) など) を使用すると、範囲クエリが機能するように見えます。しかし、データベースに専用の日付データ型があるのには、いくつかの正当な理由があります。

于 2013-08-28T13:24:44.367 に答える
0

より良い方法は次のとおりです。

where CompletionDate >= the start of your date range
and CompletionDate < the day after the end of your date range.

理由 1 は、該当する場合、時間要素が考慮されるためです。理由 2 は、where 句で関数を使用すると生産速度が低下することです。

ところで、データベースで CompletionDate が char または varchar データ型の場合、深刻な問題が発生します。

于 2013-08-28T13:21:00.187 に答える