Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL错误:向“smalldatetime”列添加值导致溢出。SQL server错误?_Sql Server_Tsql - Fatal编程技术网

Sql server T-SQL错误:向“smalldatetime”列添加值导致溢出。SQL server错误?

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

当我尝试执行以下代码时,向“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 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)