将表达式转换为数据类型datetime的算术溢出错误

时间:2009-03-11 09:24:23

标签: sql sql-server sql-server-2005

这个select语句给出了算术错误消息:

SELECT CAST(FLOOR((CAST(LeftDate AS DECIMAL(12,5)))) AS DATETIME), LeftDate 
FROM Table
WHERE LeftDate > '2008-12-31'

虽然这个有效:

SELECT CAST(FLOOR((CAST(LeftDate AS DECIMAL(12,5)))) AS DATETIME), LeftDate 
FROM Table
WHERE LeftDate < '2008-12-31'

数据是否有问题(我检查过空值,但没有)?

3 个答案:

答案 0 :(得分:9)

发现日期设置为9999-12-31时的问题,可能是小数要处理的。从小数改为浮动,每件事都像魅力一样。

答案 1 :(得分:8)

通常,将日期转换为数字或字符串以对其执行日期操作是非常低效的。 (转换是相对密集的,字符串操作也是如此。)坚持使用日期函数要好得多。

你给出的例子是(我相信)去除DateTime的时间部分,以下是没有转换开销的情况......

DATEADD(DAY, DATEDIFF(DAY, 0, <mydate>), 0)

这也应该避免算术溢出......

答案 2 :(得分:0)

也许这对某人有所帮助,因为我的问题有点不同。

引发此错误的SELECT具有许多嵌套的SELECT和许多与诸如GETDATE() - CloseDate之类的算术运算的日期比较。

然后将此类操作的结果与嵌套选择中多次提到的'1900-01-01'进行比较。

我的解决方案是为GETDATE()的结果声明变量,为datetime的{​​{1}}变量声明变量,以避免转换。

'1900-01-01'

MatBailie的答案中的Declare @CurrentDate datetime = GetDate() Declare @BlankDate datetime = '1900-01-01' ... ... @CurrentDate - CloseDate ... ... CloseDate <> @BlankDate ... 位也很有帮助。