1

10 進数の DateTime 値を DateTime データ型に変換し、選択クエリで条件を確認しようとしています

SELECT * FROM CLBALTRNTBL WHERE CONVERT(DATETIME,LSTDAT) >= @sDt 
      AND CONVERT(DATETIME,LSTDAT) <= @eDt

しかし、次のエラーが発生します

Arithmetic overflow error converting expression to data type datetime.

私はこれをストアドプロシージャで行っています。と@sDtは変数です@eDtDateTimeLSTDAT形式は次のyyyyMMddとおりです。20120317

しかし、たとえば、LSTDAT列を直接入力する20130805と、クエリが実行されます。しかし、列はどうですか??

あなたは私を助けることができます ?

4

4 に答える 4

3

列を変換するよりも、変数を変換して列と比較する方がはるかに効率的です。

SELECT * 
FROM CLBALTRNTBL 
WHERE LSTDAT >= CONVERT(INT,CONVERT(NVARCHAR(8),@sDt,112))
  AND LSTDAT <= CONVERT(INT,CONVERT(NVARCHAR(8),@eDt,112))

SQLFiddle デモ

于 2013-08-06T09:12:41.190 に答える
2
SELECT * FROM CLBALTRNTBL WHERE LSTDAT >= convert(char(8),@sDt, 112) 
AND CONVERT(DATETIME,LSTDAT) <= convert(char(8),@eDt, 112)

これにより、エラーが回避され、パフォーマンスが向上しますが、日付に変換できない無効な LSTDAT がベースに含まれています。

于 2013-08-06T08:52:53.453 に答える