2

データベースに2012-03-17 19:50:08.023の形式の日付フィールドがあります。

3月に収集されたデータを取得する選択クエリを作成したいと考えています。しかし、私はこれを達成することができません。

次のクエリを試しています。

select * from OrderHeader where
Convert(varchar,UploadDt,103) between '01/03/2013' and '31/03/2013' 
and DistUserUniqueID like  '6361%' 

このクエリは、すべての日付のデータを提供します。

select * from OrderHeader where
UploadDt between '01/03/2013' and '31/03/2013' and DistUserUniqueID like  '6361%' 

このクエリでは、Msg 242、Level 16、State 3、Line 1 というエラーが表示されます。varchar データ型から datetime データ型への変換により、範囲外の値が発生しました。

これを解決するのを手伝ってください。

前もって感謝します

4

2 に答える 2

6

列を文字列に変換しているため、最初のクエリはすべての日付を返します。なぜあなたがこれをしているのか分かりません。したがって、あなたが言うBETWEEN '01/anything' AND '31/anything'とき、それが単なる文字列であると考えると、月と年に関係なく、列内のすべての「日付」に一致します。これは、WHERE句が可能なすべての日をカバーするためです (まあ、例外を除いて) 3 月以外の月の 31 日、および 1 月と 2 月の最初の日 - すべてのデータではなく、非常に大きな割合です)。'15/11/2026'、たとえば、ですBETWEEN '01\03\2013' AND '31/03/2013'

ちょっと考えてみてください。データベースに日時データがあり、クエリを実行する前にそれを文字列に変換したいとします。比較する前に給与も文字列に変換しますか? その場合、70,000 ドルを稼いでいる人は、690,000 ドルを稼いでいる人よりも多く稼いでいるように見えます。これは、文字ベースの並べ替えが最初の文字から始まり、長さを考慮しないためです。

2 番目のクエリは、日付に地域のあいまいな形式を使用しているため、失敗します。好きかもしれませんがdd/mm/yyyy、明らかにサーバーは米国英語のフォーマットに基づいていますmm/dd/yyyy

解決策は、 などの適切で明確な形式を使用することですYYYYMMDD

BETWEEN '20130301' AND '20130313'

ただし、使用しないでくださいBETWEEN- これは使用DATETIMEする必要がある列であるためです。

WHERE UploadDt >= '20130301'
  AND UploadDt <  '20130401'

(そうしないと、 から2013-03-31 00:00:00.001までのデータが失われます2013-03-31 23:59:59.997。)

2008以降で本当に気に入った場合BETWEEN(バージョンを教えてくれませんでした)、次を使用できます。

WHERE CONVERT(DATE, UploadDt) BETWEEN '20130301' AND '20130331'

日付に関するその他のヒント:

最後に、(または任意の可変長データ型)に変換するときVARCHARは、常に length を指定します。

于 2013-03-28T12:55:12.110 に答える
-1

クエリを次のように書き直します。

select * from OrderHeader where
UploadDt between '01/03/2013' and '01/04/2013' 
and DistUserUniqueID like  '6361%'

また

select * from OrderHeader where
UploadDt between Convert(datetime,'01/03/2013', 103) and Convert(datetime,'01/04/2013',103) 
and DistUserUniqueID like  '6361%'
于 2013-03-28T12:55:43.777 に答える