請幫忙解決我的問題。
我有 2 張桌子:
- 帶有作業日和節假日的日歷;
- 計算表。
我需要計算 **startDate ** = [calcDt 5 個作業日(不包括周末和節假日)]。見例子。
我的日歷:
CREATE TABLE #Calendar(
id DATE
,isWorkDay BIT
,isHoliday BIT
);
INSERT INTO #Calendar(
id
,isWorkDay
,isHoliday
)
VALUES
('2022-01-14',1,0)
,('2022-01-15',0,0)
,('2022-01-16',0,0)
,('2022-01-17',1,0)
,('2022-01-18',1,0)
,('2022-01-19',1,0)
,('2022-01-20',1,0)
,('2022-01-21',1,0)
,('2022-01-22',0,0)
,('2022-01-23',0,0)
,('2022-01-24',1,0)
,('2022-01-25',1,0)
,('2022-01-26',1,0)
,('2022-01-27',1,0)
,('2022-01-28',1,0);
我的計算表:
CREATE TABLE #Data(
calcDate DATE
,startDate DATE
);
INSERT INTO #Data(
calcDate
)
VALUES
('2022-01-14')
,('2022-01-14')
,('2022-01-14')
,('2022-01-15')
,('2022-01-16')
,('2022-01-17')
,('2022-01-18');
我需要計算 startDate = calcDate 5 個作業日,例如:
calcDate startDate
2022-01-14 2022-01-20
2022-01-14 2022-01-20
2022-01-14 2022-01-20
2022-01-15 2022-01-21
2022-01-16 2022-01-21
2022-01-17 2022-01-21
2022-01-18 2022-01-24
uj5u.com熱心網友回復:
與日歷一起作業UPDATE。CROSS APPLY
UPDATE t
SET startDate = a.startDate
FROM #Data t
CROSS APPLY (
SELECT MAX(id) AS startDate
FROM (
SELECT TOP 5 cal.id
FROM #Calendar cal
WHERE cal.id BETWEEN t.calcDate
AND DATEADD(month, 1, t.calcDate)
AND cal.isWorkDay = 1
AND cal.isHoliday = 0
ORDER BY cal.id
) q
) a;
| 計算日期 | 開始日期 |
|---|---|
| 2022-01-14 | 2022-01-20 |
| 2022-01-15 | 2022-01-21 |
| 2022-01-16 | 2022-01-21 |
| 2022-01-17 | 2022-01-21 |
| 2022-01-18 | 2022-01-24 |
關于db<>fiddle的演示在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/410814.html
標籤:
上一篇:AJAX發送檔案,但PHP不會接收它,如果檔案太大(但不是)
下一篇:SQL選擇另一個查詢的最有效方法
