首页 > 解决方案 > 将当前值添加到未来日期 SQL

问题描述

我正在尝试加载未来日期的数据。我的情况是这样的,我有 2016 年、2017 年和 2018 年(直到 8 月)的数据。每年都有关联的当前值和“上一年同一天”值。数据汇总到月份。要求是我也加载未来日期的数据,即 2018 年 9 月至 2019 年 8 月使用“PYSD”值。例如,2017 年 9 月的“当前”值将是 2018 年 9 月的“PYSD”值,依此类推。当我尝试这个特定的逻辑时,我收到一个错误,指出“溢出”,我无法弄清楚是什么原因造成的。这只发生在我的 WHERE 子句中的第二个条件。我的 SELECT 子句将一个月的数据和输出汇总为 '08-01-2018' - 每月/每年将有一行。

SELECT 
    CAST(YEAR(DATEADD(dd, 364, CalendarDate)) AS VARCHAR(250)) 
     + '-' + RIGHT('00' + CAST(MONTH(DATEADD(dd, 364, CalendarDate)) AS VARCHAR(250)), 2) 
     + '-' + '01' AS MonthPeriod 
FROM
    DateTable 
WHERE  
    DATEADD(DD, 364, CalendarDate) > '08-31-2018' 
    AND DATEADD(DD, 364, CalendarDate) < '08-01-2019'

我的错误:

消息 517,级别 16,状态 3,第 1 行
向“日期”列添加值导致溢出。

此外,如果有更简单的方法,欢迎提出建议。我在 SQL Server 上。

TIA。

添加了示例数据:

在此处输入图像描述

标签: sqlsql-server

解决方案


正如您在原始问题的答案之一中所述,您的最大日期是9999-12-31

这意味着任何一种都DATEADD(DD, 364, CalendarDate)应该总是失败。如果您尝试检查 2018 年的日期并不重要,因为它必须先执行 dateadd,这会导致溢出。

为避免溢出,请以另一种方式添加日期 - 将实际 CalendarDate 与目标日期一年进行比较。

CalendarDate > DATEADD(DD, -364, '08-31-2018')

要不就

CalendarDate > '2017-08-31' 

我将剩下的你应该如何指定日期,或者它是否应该是 364,365,一个月的第一天等留在讨论的其余部分。


推荐阅读