[英]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.