簡體   English   中英

將當前值添加到將來的日期SQL

[英]Adding Current Values to future Dates SQL

我正在嘗試加載數據以備將來使用。 我的情況是這樣的,我有2016年,2017年和2018年的數據(到8月)。 每年都有當前和“上一年同一天”值關聯。 數據匯總到月份。 要求是我也使用'PYSD'值加載未來日期的數據,即從2018年9月到2019年8月的數據。 例如,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,級別3,狀態3,第1行
向“日期”列添加值會導致溢出。

另外,如果有更簡單的方法,請公開建議。 我在使用SQL Server。

TIA。

添加了樣本數據:

在此處輸入圖片說明

如您在原始問題的答案之一中所述,最大日期為9999-12-31

這意味着任何類型的DATEADD(DD, 364, CalendarDate)都應該總是失敗。 您是否要檢查2018年的日期都沒有關系,因為它必須先執行dateadd,這會導致溢出。

為避免溢出,請以其他方式添加您的日期-將實際的CalendarDate與目標日期之前的一年進行比較。

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

要不就

CalendarDate > '2017-08-31' 

我將在剩下的部分中剩下如何指定日期,或者是否應為364,365,第一個月等。

您的DateTable中的最大日期是多少? 您的日期可能是9999年。因此加364將導致它溢出。 它與SELECT子句無關

在查詢中,您只需執行此操作

SELECT DATEADD(MONTH, 
               DATEDIFF(MONTH, 0, 
                        DATEADD(DAY, 364, CalendarDate)), 0) AS MonthPeriod

注意: DATEADD(MONTH, DATEDIFF(MONTH, 0, <date>), 0)將為您提供每月的第一天

編輯:

發生溢出錯誤是因為DateTable包含日期為9999的行。對其添加364天將導致溢出。

一種快速解決的方法是刪除年份為9998或9999的那些行

另一種方法是更改​​查詢,使其不會在CalendarDate添加天數

WHERE  CalendarDate > DATEADD(DAY, 364, '2018-08-31')
AND    CalendarDate < DATEADD(DAY, 364, '2019-08-01')

注意:我使用ISO格式YYYY-MM-DD日期字符串。 建議以明確的日期格式指定日期。

完整的查詢將是

SELECT DATEADD(MONTH, 
               DATEDIFF(MONTH, 0, 
                        DATEADD(DAY, 364, CalendarDate)), 0) AS MonthPeriod 
FROM   DateTable
WHERE  CalendarDate > DATEADD(DAY, 364, '2018-08-31')
AND    CalendarDate < DATEADD(DAY, 364, '2019-08-01')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM