如何在where子句中将Decimal转换为DateTime

时间:2013-08-06 08:50:10

标签: sql sql-server datetime decimal converter

我正在尝试将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@eDtDateTime变量。 LSTDAT的格式为yyyyMMdd,即20120317

但如果我直接输入LSTDAT列,例如20130805,则执行查询。但是用什么列?

你可以帮帮我吗?

4 个答案:

答案 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