1

我正在尝试将 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.

我在存储过程中执行此操作。和@sDtand@eDtDateTime变量。LSTDAT格式为,yyyyMMdd20120317

但是,如果我LSTDAT直接输入列,例如:20130805,查询就会执行。但是柱子呢??

你能帮我吗 ?

4

4 回答 4

5

尝试这个 :

SELECT *
FROM CLBALTRNTBL
WHERE CONVERT(DATETIME, CONVERT(VARCHAR(8), LSTDAT), 112) >= @sDt
    AND CONVERT(DATETIME, CONVERT(VARCHAR(8), LSTDAT), 112) <= @eDt
于 2013-08-06T09:05:55.937 回答
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 回答
2
SELECT * FROM CLBALTRNTBL WHERE CONVERT(DATETIME,LSTDAT) >= @sDt 
      AND CONVERT(DATETIME,Convert(VarChar(8),LSTDAT),112) <= @eDt

将是一种方式。

例如 20120317 到 '20120317' 然后 112 是 ISO 格式 yyyyMMdd

于 2013-08-06T08:56:18.073 回答