0

私が使用しているコードは次のとおりです。

SELECT SalesItemPK
,FieldName
,Value /*Convert date to the first of the selected month*/
FROM [Oasis].[dbo].[vw_SALES_SalesItemDetails]
WHERE SalesItemPK IN(
1425
,1225
,1556
,1589
,1599
,1588
,1590)
AND FieldName = 'Estimated Ship Date'
AND CONVERT(DATETIME, Value) >= CONVERT(DATETIME, '1/1/2010')

(それらはクエリ内のすべての行であるため、これらの PK のみを選択しています。)

これは私が受け取るエラーです:

varchar データ型から datetime データ型への変換により、範囲外の値が発生しました

以下は、私のビューから返されたデータのサンプルです。最終的な解決策では、実際に値をそれぞれの月の最初の月に変換します。しかし、どちらの方法でもエラーがスローされます。

ここに画像の説明を入力

WHERE を削除すると、正常に動作します。そのため、今のところ理解できないような奇妙なことが起こっています。何か案は?

4

2 に答える 2

6

おそらく、日付が d/m/y として解釈されている (18 番目の月がないため、最初の行が失敗する) か、最初の部分 (月) が > 12 であるデータがそこにある可能性があります。

問題のある行を見つけるには:

SELECT Value FROM [Oasis].[dbo].[vw_SALES_SalesItemDetails]
  WHERE SalesItemPK IN (1425,1225,1556,1589,1599,1588,1590)
  AND ISDATE(Value) = 0;

(そして、問題のある行を見つけた場合は、明らかにそれらを修正してください。)

次を使用して、値が m/d/y として解釈されることを確認することもできます (列内の他のガベージで失敗しません)。

SELECT SalesItemPK, FieldName, Value,
  FirstOfMonth = CASE WHEN ISDATE(Value) = 1 THEN 
    DATEADD(DAY,1-DAY(CONVERT(DATETIME,Value,101)),CONVERT(DATETIME,Value,101)) END 
FROM [Oasis].[dbo].[vw_SALES_SalesItemDetails] 
WHERE SalesItemPK IN (1425,1225,1556,1589,1599,1588,1590)
  AND FieldName = 'Estimated Ship Date'
  AND CASE WHEN ISDATE(Value) = 1 THEN CONVERT(DATETIME, Value, 101) 
    ELSE NULL END >= '20100101';

また、PK 値に対して句を実行したからといって、WHERESQL Server が最初にその条件を評価する必要があるわけではないことに注意してください。ビュー内のすべての行 (つまり、ソース テーブル内のすべての行) をDATETIME最初の行に変換しようとする可能性があります。CASEそのため、念のため、式もSELECTリストに追加しました。しゃれは意図されていません。また、月の初日を簡単に計算する方法についても提案しました (多くの人は、文字列に変換するなど、非常に奇妙なことをする傾向があります)。

ビューが別の列をdatetimeとして公開した場合、このクエリがどれほど単純になるか考えていますか?

, DateValue = CASE WHEN ISDATE(Value) = 1 THEN CONVERT(DATETIME, Value, 101)

次に、クエリは次のようになります。

SELECT SalesItemPK, FieldName, DateValue, 
  FirstOfMonth = DATEADD(DAY, 1-DAY(DateValue), DateValue)
FROM [Oasis].[dbo].[vw_SALES_SalesItemDetails]
WHERE SalesItemPK IN (1425,1225,1556,1589,1599,1588,1590)
AND DateValue >= '20100101';

FirstOfMonth実際、ビューは計算を公開することもできます。

これらは、日付/時刻データを文字列として保存してはならない、非常に多くの、非常に多くの理由の一部です。少なくとも、ビューを変更して、これらの文字列を ではなく、言語、日付形式、および地域に完全に依存しない文字列 ( yyyymmdd) として表示しmm/dd/yyyyます。

于 2013-08-22T14:38:16.303 に答える
0

おそらく、日付値の 1 つが正しい形式ではありません。次のクエリを試して、日付として変換できない値のリストを見つけてください。

 select value from [Oasis].[dbo].[vw_SALES_SalesItemDetails] where isdate(value) = 0
于 2013-08-22T14:39:46.750 に答える