Sql server T-SQL错误:向“smalldatetime”列添加值导致溢出。SQL server错误?
当我尝试执行以下代码时,向“smalldatetime”列添加值时出错,导致溢出:Sql server T-SQL错误:向“smalldatetime”列添加值导致溢出。SQL server错误?,sql-server,tsql,Sql Server,Tsql,当我尝试执行以下代码时,向“smalldatetime”列添加值时出错,导致溢出: DECLARE @t TABLE (ID UNIQUEIDENTIFIER, BegDate SMALLDATETIME, EndDate SMALLDATETIME) INSERT INTO @t SELECT NEWID(), '19000101', '20151124' -- This is to show you that nothing is really selected SELECT 'You
DECLARE @t TABLE (ID UNIQUEIDENTIFIER, BegDate SMALLDATETIME, EndDate SMALLDATETIME)
INSERT INTO @t
SELECT NEWID(), '19000101', '20151124'
-- This is to show you that nothing is really selected
SELECT 'You will never see it'
FROM @t r1
INNER JOIN @t r2 ON r2.ID = r1.ID
WHERE 1=1
AND r1.BegDate > r2.BegDate
AND r1.EndDate <= r2.EndDate
SELECT r1.ID, r2.BegDate, DATEADD(DAY, -1, r1.BegDate) AS EndDate
FROM @t r1
INNER JOIN @t r2 ON r2.ID = r1.ID
WHERE 1=1
AND r1.BegDate > r2.BegDate -- This guarantees that r1.BegDate is not minimal value
AND r1.EndDate <= r2.EndDate
如您所见,DATEADD的结果不能小于最小值。此外,不能调用DATEADD,因为SELECT不能返回任何内容。
这是SQL server错误吗?该值的日期范围如下:
1900-01-01至2079-06-06
1900年1月1日至2079年6月6日
您得到错误是因为您的计算导致日期超出此边界:
DECLARE @BegDate SMALLDATETIME = '19000101'
SELECT @BegDate
SELECT DATEADD(DAY, -1, @BegDate)
问题是,为什么在FROM、JOIN和WHERE填充之前执行SELECT填充,因为这不是
如果将19000101值更改为19000102,仅为了获取SQL引擎正在构建的执行计划,您应该看到:
计算标量实际上是DATEADD函数的执行:
因此,执行DATEADD函数并抛出一个错误。这是因为:
注意,语句的实际物理执行是确定的
由查询处理器执行,并且顺序可能与此列表不同
我在这里得到了答复: 在这种情况下,我可以使用OPTIONFORCE命令:
SELECT r1.ID, r2.BegDate, DATEADD(DAY, -1, r1.BegDate) AS EndDate
FROM @t r1
INNER JOIN @t r2 ON r2.ID = r1.ID
WHERE 1=1
AND r1.BegDate > r2.BegDate -- This guarantees that r1.BegDate is not minimal value
AND r1.EndDate <= r2.EndDate
OPTION(FORCE ORDER)
伙计们,我知道SMALLDATETIME的范围,但我的WHERE子句的谓词使得DATEADDDAY、-1、'19000101'无法执行。但SQL Server似乎认为它非常聪明,并试图防止我已经防止的错误。对于这种奇怪的行为,我找不到任何解决方法。您的解决方法与我的代码不同:我需要DATEADDDAY,-1,r1.BegDate,但您建议改为DATEADDDAY,-1,r2.BegDate。@FameT。在这种情况下,只需使用IIF跳过操作。为什么要使用smalldate?如果未指定时间部分,则日期是适当的类型needed@PanagiotisKanavos-SQL数据库产品应该遵循一个逻辑处理顺序,或者,如果它们选择不遵循,则应该产生与遵循逻辑处理顺序相同的行为。问题是,SQL Server有时会违反这一要求。为什么选择smalldatetime?它的范围有限,1899-12-31超出了范围,在你的情况下,你似乎在寻找dateSee,可以自由投票,但也可以自由地对它的年龄感到沮丧。
SELECT r1.ID, r2.BegDate, DATEADD(DAY, -1, r1.BegDate) AS EndDate
FROM @t r1
INNER JOIN @t r2 ON r2.ID = r1.ID
WHERE 1=1
AND r1.BegDate > r2.BegDate -- This guarantees that r1.BegDate is not minimal value
AND r1.EndDate <= r2.EndDate
OPTION (FORCE ORDER)
SELECT r1.ID, r2.BegDate, DATEADD(DAY, -1, r1.BegDate) AS EndDate
FROM @t r1
INNER JOIN @t r2 ON r2.ID = r1.ID
WHERE 1=1
AND r1.BegDate > r2.BegDate -- This guarantees that r1.BegDate is not minimal value
AND r1.EndDate <= r2.EndDate
OPTION(FORCE ORDER)