【问题标题】:"Adding a value to a 'datetime' column caused an overflow."“向 'datetime' 列添加值导致溢出。”
【发布时间】:2012-03-13 04:26:27
【问题描述】:

MSDN中明确表示:

日期参数不能增加到超出其数据类型范围的值。在以下语句中,添加到日期值的数值超出了日期数据类型的范围。返回以下错误消息:“向 'datetime' 列添加值导致溢出。”

还有例子:

SELECT DATEADD(year,2147483647, '2006-07-31');
SELECT DATEADD(year,-2147483647, '2006-07-31');

导致错误的原因:

“向 'datetime' 列添加值导致溢出。”

这似乎是正确的。但是为什么我在执行这个 SQL 语句时得到同样的错误:

SELECT DATEDIFF(YY,'1013-12-12',DATEADD(YY,-300,getdate()))

更具体且仅:

SELECT DATEADD(YY,-300,getdate())

【问题讨论】:

  • datetime 的最小值是 1753 because that was the year after Britain adopted the Gregorian Calendar 你使用的是什么版本的 SQL Server?
  • @Joro - 那么SELECT DATEADD(YY,-300,cast(getdate() as datetime2)) 会为你工作。
  • @MartinSmith 是的,你是对的。我已经检查了从 0001 年 1 月 1 日到 9999 年 12 月 31 日的日期和 'datetime2' 和 'datetimeoffset' 格式支持。到目前为止的 SQL 语句是否意味着 getdate() 函数的默认类型是 'datetime' 以及为什么如果它据说 'datetime' 和 'smalldatetime' 贬值了。

标签: sql-server function tsql date sql-server-2008-r2


【解决方案1】:

First google result for 'sql datetime range'。 1753 年 1 月 1 日。这是你的下限。

对这个问题的评论添加了this trivia 关于这个下限的起源。

【讨论】:

  • 不错。谢谢你的回答,但这是一种悲伤。例如,如果某人将今年之前的历史信息存储在他的数据库中,他将无法使用某些内置功能...
  • 为了处理前格里高利时期,设计将日期存储为文本。这会带来一些不便,但我们可以从哲学上理解它(正如他们所说),因为这种需求非常不寻常(即使很重要)。
【解决方案2】:

如果您使用字段进行 DateTime 转换,请在转换中使用 case 语句来检查该字段是否大于 1 或 1000000,那么您应该不会再遇到这个问题了。

【讨论】:

    【解决方案3】:

    在比较 2 个日期期间我遇到了同样的错误。

    我已经解决了使用 datetime2 数据类型的问题。

    例如

    select * from TableA where Convert(datetime2,GETUTCDATE()) <= Convert(datetime2,Expirydate)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 2011-06-12
      相关资源
      最近更新 更多