我正在尝试将Decimal 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
和@eDt
是DateTime
变量。 LSTDAT
的格式为yyyyMMdd
,即20120317
但如果我直接输入LSTDAT
列,例如20130805
,则执行查询。但是用什么列?
答案 0 :(得分:5)
试试这个:
SELECT *
FROM CLBALTRNTBL
WHERE CONVERT(DATETIME, CONVERT(VARCHAR(8), LSTDAT), 112) >= @sDt
AND CONVERT(DATETIME, CONVERT(VARCHAR(8), LSTDAT), 112) <= @eDt
答案 1 :(得分:3)
转换变量并与列进行比较比转换列更有效。
SELECT *
FROM CLBALTRNTBL
WHERE LSTDAT >= CONVERT(INT,CONVERT(NVARCHAR(8),@sDt,112))
AND LSTDAT <= CONVERT(INT,CONVERT(NVARCHAR(8),@eDt,112))
<强> SQLFiddle DEMO 强>
答案 2 :(得分:2)
SELECT * FROM CLBALTRNTBL WHERE LSTDAT >= convert(char(8),@sDt, 112)
AND CONVERT(DATETIME,LSTDAT) <= convert(char(8),@eDt, 112)
这可以防止您的错误并且执行速度更快,但是您的基地中有一些无法转换为日期的无效LSTDAT
答案 3 :(得分:2)
SELECT * FROM CLBALTRNTBL WHERE CONVERT(DATETIME,LSTDAT) >= @sDt
AND CONVERT(DATETIME,Convert(VarChar(8),LSTDAT),112) <= @eDt
将是一种方式。
e.g。 20120317到'20120317'然后112是ISO格式yyyyMMdd