2017-02-15 63 views
0

我有一個系統可以從兩個客戶端數據庫讀取。對於兩個客戶,他們都有不同的截止日期格式:一個SQL存儲過程獲取兩種不同截止日期格式的截止日期

1)客戶A:每月15號。例如:15-12-2016。

2)客戶端B:每個月的第一天。例如:1-1-2017。

的截止日期都存儲在表如下: enter image description here

現在我需要一個查詢檢索當月的切斷客戶端的日期。例如,今天是15-2-2017,所以對於這兩個客戶端的預期截止日期應該如下:

1)客戶端A:15-1-2017

2)客戶端B:1- 2-2017

如何在單個存儲過程中完成此操作?對於客戶B,我總是可以獲得本月的第一天。但這不適用於客戶A,因爲它們的截止日期是上個月的日期。

+0

你存儲*偏移*(或*切斷*)的地方?我假設有一個'客戶'的表'列'CutOff INT NOT NULL',其中B有'1',A有'15'。我的假設是否正確? – Shnugo

+0

@Shnugo不幸的是,沒有任何地方存儲這些價值。我們只有截止日期,因爲它是由我們的客戶輸入 –

+0

因此,客戶的最早(第一個)現有日期決定了這個*截止日期*?你將來需要多久才能做到這一點? – Shnugo

回答

0

可能是這樣的,你正在尋找:

DECLARE @DummyClient TABLE(ID INT IDENTITY,ClientName VARCHAR(100)); 
DECLARE @DummyDates TABLE(ClientID INT,YourDate DATE); 
INSERT INTO @DummyClient VALUES 
('A'),('B'); 
INSERT INTO @DummyDates VALUES 
(1,{d'2016-12-15'}),(2,{d'2017-01-01'}); 

WITH Numbers AS 
(   SELECT 0 AS Nr 
UNION ALL SELECT 1 
UNION ALL SELECT 2 
UNION ALL SELECT 3 
UNION ALL SELECT 4 
UNION ALL SELECT 5 
UNION ALL SELECT 6 
UNION ALL SELECT 7 
UNION ALL SELECT 9 
UNION ALL SELECT 10 
UNION ALL SELECT 11 
UNION ALL SELECT 12 
UNION ALL SELECT 13 
UNION ALL SELECT 14 
UNION ALL SELECT 15 
UNION ALL SELECT 16 
UNION ALL SELECT 17 
UNION ALL SELECT 18 
UNION ALL SELECT 19 
UNION ALL SELECT 20 
UNION ALL SELECT 21 
UNION ALL SELECT 22 
UNION ALL SELECT 23 
UNION ALL SELECT 24 
) 
,ClientExt AS 
(
    SELECT c.* 
      ,MIN(d.YourDate) AS MinDate 
    FROM @DummyClient AS c 
    INNER JOIN @DummyDates AS d ON c.ID=d.ClientID 
    GROUP BY c.ID,c.ClientName 
) 
SELECT ID,ClientName,D 
FROM ClientExt 
CROSS APPLY(SELECT DATEADD(MONTH,Numbers.Nr,MinDate) 
      FROM Numbers) AS RunningDate(D); 

結果

ID Cl Date 
1 A 2016-12-15 
1 A 2017-01-15 
1 A 2017-02-15 
1 A 2017-03-15 
1 A 2017-04-15 
1 A 2017-05-15 
1 A 2017-06-15 
1 A 2017-07-15 
1 A 2017-09-15 
1 A 2017-10-15 
1 A 2017-11-15 
1 A 2017-12-15 
1 A 2018-01-15 
1 A 2018-02-15 
1 A 2018-03-15 
1 A 2018-04-15 
1 A 2018-05-15 
1 A 2018-06-15 
1 A 2018-07-15 
1 A 2018-08-15 
1 A 2018-09-15 
1 A 2018-10-15 
1 A 2018-11-15 
1 A 2018-12-15 
2 B 2017-01-01 
2 B 2017-02-01 
2 B 2017-03-01 
2 B 2017-04-01 
2 B 2017-05-01 
2 B 2017-06-01 
2 B 2017-07-01 
2 B 2017-08-01 
2 B 2017-10-01 
2 B 2017-11-01 
2 B 2017-12-01 
2 B 2018-01-01 
2 B 2018-02-01 
2 B 2018-03-01 
2 B 2018-04-01 
2 B 2018-05-01 
2 B 2018-06-01 
2 B 2018-07-01 
2 B 2018-08-01 
2 B 2018-09-01 
2 B 2018-10-01 
2 B 2018-11-01 
2 B 2018-12-01 
2 B 2019-01-01