这个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'
数据是否有问题(我检查过空值,但没有)?
发现日期设置为9999-12-31时的问题,可能是小数要处理的大。从小数改为浮动,每件事都像魅力一样。
通常,将日期转换为数字或字符串以对其执行日期操作是非常低效的。 (转换是相对密集的,字符串操作也是如此。)坚持使用日期函数要好得多。
你给出的例子是(我相信)去除DateTime的时间部分,以下是没有转换开销的情况......
DATEADD(DAY, DATEDIFF(DAY, 0, <mydate>), 0)
这也应该避免算术溢出......
也许这有助于某人,因为我的问题有点不同。
抛出此错误的SELECT有许多嵌套的SELECT,并且许多日期与GETDATE() - CloseDate
等算术运算进行比较。
然后将这些操作的结果与在嵌套SELECT中多次提到的'1900-01-01'
进行比较。
我的解决方案是为GETDATE()
声明datetime
和'1900-01-01'
变量的结果变量,以避免转换。
Declare @CurrentDate datetime = GetDate()
Declare @BlankDate datetime = '1900-01-01'
...
... @CurrentDate - CloseDate ...
... CloseDate <> @BlankDate ...
来自MatBailie答案的DATEADD(DAY, DATEDIFF(DAY, 0, <mydate>), 0)
位也很有帮助。