2017-10-16 33 views
0

我們爲客戶提供服務,每個客戶都有90天的授權 我想創建一個函數,將整個月的時間計爲15天。例如,假設客戶在10/17/2017獲得授權。它意味着它是不超過15天的十月,這樣的授權不會爲月數,但它有計數十一月,十二月和一月2018函數來計算X個金額作爲一個整月的天數

;WITH CTE AS (
    select 
     d.ClientId, 
     LOC 
     datediff(day, l.DecisionOn, d.duedate) 'Days', 
     l.DecisionOn, 
     d.duedate 
    from code d 
     join codeloc l on d.curdocversionid = l.docversionid 
     join codeaccess a on a.docversionid = d.curdocversionid 
    where codeid = 69999 
      and aoca in ('68','69','70','71','72','74') 
), 
T AS (
SELECT ClientId, LOC, COUNT(*) CNT FROM CTE 
WHERE [Days] > 15 
    AND AuthorizedDecisionOn > DATEADD(MONTH, (CASE WHEN DAY(GETDATE()) > 15 THEN 1 ELSE 0 END) , CAST(GETDATE() as date)) 
    AND duedate < DATEADD(MONTH,3 + (CASE WHEN DAY(GETDATE()) > 15 THEN 1 ELSE 0 END) , CAST(GETDATE() as date)) 
GROUP BY ClientId, LOC 
) 
+1

問題是什麼用您的查詢?你可以從表格中添加一些示例數據嗎? – 2017-10-16 15:47:19

+0

他們希望能夠看到有多少當前客戶端在任何給定時間都被授權,這些客戶端可以用於計算目標 – Chairbedding

+0

使用適當的軟件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服務器2014'。語法和功能的差異往往會影響答案。請注意,'tsql'縮小了選擇範圍,但不指定數據庫。表格模式,樣本數據和預期結果非常有用。 – HABO

回答

0

這裏有一個內嵌表值函數(iTvf),這將使你需要什麼。 (注:我用iTvf的,因爲他們跑贏標量UDF)

CREATE FUNCTION dbo.monthsBetweenMinDay 
(
    @fromDate date, 
    @toDate date, 
    @minDays tinyint 
) 
RETURNS TABLE WITH SCHEMABINDING AS RETURN 
SELECT Months = m.mb + 
    CASE WHEN DATEDIFF(day,d.fd,dateadd(month, -m.mb, d.td)) >= @minDays THEN 1 ELSE 0 END 
FROM (VALUES (@fromDate, @toDate)) d(fd,td) -- from date and todate 
CROSS APPLY (VALUES(
    CASE WHEN d.fd > d.td THEN NULL 
     WHEN DATEPART(day, d.fd) > DATEPART(day, d.td) THEN DATEDIFF(month, d.fd, d.td)-1 
     ELSE DATEDIFF(month, d.fd, d.td) END)) m(mb); 

這裏的功能在行動的例子:

-- sample data 
CREATE TABLE #dates (date1 date, date2 date); 

INSERT #dates 
SELECT dt.dt, CAST(DATEADD(day, [days].d, DATEADD(month, months.m, dt.dt)) as date) 
FROM (VALUES ('20170101')) dt(dt), (VALUES (4),(15),(25)) [days](d), (VALUES(0),(1),(4)) months(m); 

-- solution 
SELECT * 
FROM #dates d 
CROSS APPLY dbo.monthsBetweenMinDay(d.date1, d.date2, 15); 

結果

date1  date2  Months 
---------- ---------- ----------- 
2017-01-01 2017-01-05 0 
2017-01-01 2017-01-16 1 
2017-01-01 2017-01-26 1 
2017-01-01 2017-02-05 1 
2017-01-01 2017-02-16 2 
2017-01-01 2017-02-26 2 
2017-01-01 2017-05-05 4 
2017-01-01 2017-05-16 5 
2017-01-01 2017-05-26 5 
+0

試圖在一個月內做到這一點是可以的。我需要在幾個月之間的天。例如。 2017年8月28日 和 2017年10月16日 – Chairbedding

+0

這是可以的,當試圖做一個月。我需要在幾個月之間的天。例如。 2017年8月28日和 2017年10月16日 的clientId,年,月,計數,如果countstowardstarget(計數> 15) 2,2017年,8,4,0 2,2017,9,30,1 2,2017,10,16,1 by clientid,year,month。 第8個月計數爲0的原因是,客戶在08/28/2017收到服務時,該月已過去4天。所以它不會計數。 – Chairbedding