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

Sql 将表达式转换为数据类型datetime时出现算术溢出错误,sql,sql-server,sql-server-2005,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 Left

此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'
选择CAST(FLOOR((CAST(LeftDate为十进制(12,5)))作为DATETIME),LeftDate
从桌子上
其中LeftDate<'2008-12-31'

数据可能有什么问题吗(我检查了空值,但没有)?

发现问题在于日期设置为9999-12-31,可能设置为大以便小数处理。从十进制变为浮点数,每件事情都像一个魔咒一样工作。

一般来说,将日期转换为数字或字符串,对其执行日期操作,效率非常低。(转换是相对密集的,字符串操作也是如此。)最好只使用日期函数

您给出的示例是(我相信)去掉DateTime的时间部分,下面这样做没有转换的开销

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

这也应该避免算术溢出…

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

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

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

我的解决方案是为
GETDATE()
的结果声明变量,为
'1900-01-01'
datetime
变量声明变量,以避免转换

Declare @CurrentDate datetime = GetDate()
Declare @BlankDate datetime = '1900-01-01'
...
... @CurrentDate - CloseDate ...
... CloseDate <> @BlankDate ...
Declare@CurrentDate datetime=GetDate()
声明@BlankDate-datetime='1900-01-01'
...
... @当前日期-关闭日期。。。
... CloseDate@BlankDate。。。

MatBailie的回答中的
DATEADD(DAY,DATEDIFF(DAY,0,),0)
位也很有用。

@gbn但它不会这样做
DATEDIFF(ms,'1970-01-01',getdate())
。谢谢@MatBailie解决了我的问题!使用CAST时出现“算术溢出错误,将表达式转换为数据类型datetime”错误