2
SELECT Asset.AssetID, AnsMaint.Answer, Convert(datetime, AnsMaint.Answer) as maintasdate
FROM Asset INNER JOIN 
AssetAnswer AnsMaint ON AnsMaint.AssetID = Asset.AssetID INNER JOIN  
AssetField FldMaint ON FldMaint.AssetFieldID = AnsMaint.AssetFieldID 
WHERE FldMaint.FieldText = 'Maint. Agreement Term' 
AND ISDATE(AnsMaint.Answer) = 1 
AND Convert(datetime, AnsMaint.Answer) < DateAdd(d, 145, GetDate())

AND の最後の部分でエラーが発生します。AND をコメントアウトすると、正常に動作します。DB 内の私の日付はたまたま 2012 年 10 月 10 日であり、有効です。IsDate は、無効なものを除外する必要があります。

DB での結果 (最後の行をコメントアウトしたとき)。私は完全に困惑しています。

106 10/10/2012  2012-10-10 00:00:00.000
115 10/10/2012  2012-10-10 00:00:00.000

もっと興味深い情報。最後のAND行を次のように変更すると

AND DateAdd(d, cast(Asset.MaintenanceFreq as int), Convert(datetime, AnsMaint.Answer)) < DateAdd(d, 45, GetDate()) 

できます。2 番目のパラメーター (int としてキャスト) を取り出して数値またはゼロに置き換えると、同じエラーが発生します。

私は困惑しています。どんな助けでも大歓迎です!

ああ、AssetMaint.Answer は DB の varchar フィールドです。それについては何もできません。

4

2 に答える 2

1

説明から、Answer列には日付に変換できない一部のレコードの値が含まれているように思われ、SQLはISDATEより前にCONVERTを評価する実行プランを選択しています。

代わりに、変換にCASEステートメントを使用してみてください。

WHERE FldMaint.FieldText = 'Maint. Agreement Term' 
AND CASE ISDATE(AnsMaint.Answer) 
   WHEN 1 THEN Convert(datetime, AnsMaint.Answer, 103) 
END < DateAdd(d, 145, GetDate())
于 2012-10-23T16:35:32.537 に答える
0

推測ですが、mm/dd/yyyy 対 dd/mm/yyyy だったと思います。たとえば、10/10 は問題ありませんが、20/10 または 10/20 はそうではない可能性があります。

スタイルパラメータを変換に追加します。

Convert(datetime, AnsMaint.Answer,103)

入力ミスしたフィールドにある日付形式に基づいて、どれを調べる必要があります。

于 2012-10-23T16:32:38.497 に答える