2017-10-16 11 views
0

私たちはクライアントにサービスを提供しており、各クライアントは90日間の承認を受けています 15ヶ月間をカウントする機能を作成したいと思います。 たとえば、クライアントが10/17/2017に承認を取得したとします。これは、認証が10月のためにカウントされませんように、それは10月の15日未満のだ意味していますが、それは11月、12月と1月のためにカウントすることがある2018年Xの金額を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

彼らは、現在のクライアント数がいつでも許可されていることをいつでも確認できるようにしたいと考えています。 – Chairbedding

+0

適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベース質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 'tsql'は選択肢を絞り込みますが、データベースは指定しないことに注意してください。テーブルスキーマ、サンプルデータ、期待される結果は非常に役に立ちます。 – HABO

答えて

0

ここで得られますインラインテーブル値関数(iTvf)があります何が必要なのか (注:彼らはスカラーUDFを上回るので、私はiTvf年代を使用)

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

これは1か月間それをやろうとすると大丈夫です。私は月の間の日にそれをしたい。例えば。 8/28/2017 と 10/16/2017 – Chairbedding

+0

これは1か月間実行しようとすると問題ありません。私は月の間の日にそれをしたい。例えば。 2017年8月28日 及び2017年10月16日 のClientID、年、月、カウント、countstowardstarget(> 15カウント) 2、2017、8、4、0 2、2017、9、30、1の場合 2、2017、10、16、1 グループ別、年、月。 月のカウントが0の理由は、月が4日以上経過した08/28/2017にクライアントがサービスを受けたためです。それはカウントされません。 – Chairbedding

関連する問題