【问题标题】:Sql Server Managment DateTime OverFlow d, -100000, get datetime errorSql Server管理DateTime OverFlow d,-100000,获取日期时间错误
【发布时间】:2021-11-28 09:09:48
【问题描述】:

嘿,我不知道我问了几个与我使用相同程序的朋友,但他们无法帮助我解决这个问题。

我尝试在 hp proliant d380 Gen6 上运行我的服务器,我得到了 iLo(idk,如果这会导致问题或任何事情)

它的副本在 Gen2 no iLo 上运行良好,所以不能多说 无论如何:

select dbo.ents.containerId
From dbo.Ents
Where LastActive > DATEADD(d, -100000, GETDATE ());

我的错误:

SQLERROR: 517 22007 [Microsoft][SQL Server Native Client 11.0][SQL 服务器] 向“日期时间”列添加值导致溢出

不知道是什么原因造成的 如果我对计算机本身的日期/时间做了其他事情(我的想法),我测试了重新安装程序甚至其他版本并重新安装了 Ws2016

所以现在我在这里寻求帮助。我在这里看到了一些话题 但是除了添加数据库(编辑数据库文件中的基本内容)之外,我对这个程序知之甚少,当我添加 SQL 文件或在我拥有的数据库中编辑某些内容时运行查询呵呵

【问题讨论】:

  • 你能解释一下你想用查询的WHERE 子句做什么吗?
  • 100,000 天前大约是 273 年前;这是故意的吗? datetime 只能追溯到 1753,而 1748 是在那之前。如果您需要很早以前的日期,则说明您使用了错误的数据类型。

标签: sql sql-server tsql


【解决方案1】:

Getdate() 返回一个日期时间数据类型。将您的值添加到它会引发错误,因为结果超出了数据类型的域。正如其他人所指出的,这种逻辑是可疑的,但只有您知道使用这种奇怪增量的原因。当我在它的时候:

DATEADD(d, -100000, GETDATE ())

通过输入“d”而不是“day”,您节省了多少精力?哪个更具可读性?懒惰会导致不良习惯和难以阅读/理解的代码。

要修复这个特定错误(但可能会添加另一个小问题),您可以使用 sysdatetime():

with cte (LastActive) as (select cast('20000102' as datetime) )
select * from cte 
where LastActive > DATEADD(day, -100000, sysdatetime());

select DATEADD(day, -100000, sysdatetime());

Sysdatetime() 返回 datetime2,它比 datetime 更准确,并且具有更大的域(从 0001-01-01 开始)。由于比较的数据类型优先级,您的 datetime 列将隐式“上转换”为 datetime2。我将留给您弄清楚当您比较这两种不同的数据类型以及额外精度的影响时会发生什么。这可能与您的情况无关,但需要承认。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2015-05-21
    • 1970-01-01
    • 2011-02-07
    • 2017-01-11
    • 2017-11-01
    相关资源
    最近更新 更多