如果X量的天数为整月,则计算功能

时间:2017-10-16 15:40:57

标签: sql tsql reporting-services

我们为客户提供服务,每位客户都有90天的授权 我想创建一个15天完整月份的功能。 例如,假设客户在2017年10月17日获得授权。这意味着10月份不到15天,因此授权不计入10月份,但必须计入2018年11月,12月和1月。

;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 个答案:

答案 0 :(得分:0)

这是一个内联表值函数(iTvf),可以满足您的需求。 (注意:我使用iTvf&#39;因为它们的性能优于标量udfs)

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