我有一个查询将一些新记录插入表中,myTbl来自临时表myTblTemp。
在查询中,如果日期是星期六或星期日,我会调整其中一个字段'AnnDate'。但是,如果日期是银行假日,我还需要调整AnnDate。
我有一张桌子,tblBankHoliday列出了所有需要的银行假期。如果在tblBankHoliday中找到AnnDate,如何调整我的查询(或者我是否需要单独的查询),这将增加一天的日期?
我当前的查询
insert into myTbl(AnnDate, USDVal)
case DATENAME(WEEKDAY, AnnDate)
when 'Saturday'
then DATEADD(DD, 2, AnnDate)
when 'Sunday'
then DATEADD(DD, 1, AnnDate)
else AnnDate
end
from myTblTemp
答案 0 :(得分:1)
制作一张表格,例如thedays
。插入相关期间的所有日期。例如在theday
列中。在另一栏例如isworkday
标记工作日,其中1个非工作日为0。
然后,您可以在查询中的某一天或之后选择下一个工作日。
insert into myTbl(AnnDate, USDVal)
(SELECT min(theday)
FROM thedays
WHERE theday >= AnnDate
AND theday.isworkday = 1)
...
from myTblTemp
答案 1 :(得分:1)
Sticky bit的答案对你的情况更好。
您可以使用递归CTE在无效日期之间循环,并持续增加1天,直到您的验证完成。
;WITH PatchedDates AS
(
SELECT
InitialAnnDate = C.AnnDate,
CorrectedAnnDate = C.AnnDate,
USDVal = C.USDVal,
IsDateOK = CASE
WHEN
EXISTS (SELECT 1 FROM tblBankHoliday AS X WHERE X.BankHoliday = C.AnnDate) OR
DATENAME(WEEKDAY, C.AnnDate) IN ('Saturday', 'Sunday') THEN 'No'
ELSE 'Yes' END
from
myTblTemp AS C
LEFT JOIN tblBankHoliday AS T ON C.AnnDate = T.BankHoliday
UNION ALL
SELECT
InitialAnnDate = C.InitialAnnDate,
CorrectedAnnDate = DATEADD(DAY, 1, C.CorrectedAnnDate),
USDVal = C.USDVal,
IsDateOK = CASE
WHEN
EXISTS (SELECT 1 FROM tblBankHoliday AS X WHERE X.BankHoliday = DATEADD(DAY, 1, C.CorrectedAnnDate)) OR
DATENAME(WEEKDAY, DATEADD(DAY, 1, C.CorrectedAnnDate)) IN ('Saturday', 'Sunday') THEN 'No'
ELSE 'Yes' END
FROM
PatchedDates AS C
WHERE
C.IsDateOK = 'No'
)
insert into myTbl(
AnnDate,
USDVal)
SELECT
AnnDate = C.CorrectedAnnDate,
USDVal = C.USDVal
FROM
PatchedDates AS C
WHERE
C.IsDateOK = 'Yes'