【问题标题】:Arithmetic overflow error converting expression to data type datetime将表达式转换为数据类型日期时间的算术溢出错误
【发布时间】:2009-03-11 09:24:22
【问题描述】:

这个选择语句给了我算术错误信息:

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'

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

【问题讨论】:

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


    【解决方案1】:

    发现问题出在日期设置为 9999-12-31 时,可能对于小数点处理来说太大了。从小数变为浮点数,一切都像魅力一样运作。

    【讨论】:

      【解决方案2】:

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

      您给出的示例是(我相信)剥离 DateTime 的时间部分,以下是在没有转换开销的情况下做到这一点...

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

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

      【讨论】:

      • @gbn 但它不会这样做datediff(ms,'1970-01-01',getdate())。
      • 感谢@MatBailie 这解决了我的问题!使用 CAST 给了我“将表达式转换为数据类型日期时间的算术溢出错误”错误
      【解决方案3】:

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

      引发此错误的 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, &lt;mydate&gt;), 0) 位也很有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 2023-03-15
        相关资源
        最近更新 更多