2017-04-04 6 views
0

私はt-sqlで解決する必要がある複雑な問題があります。カーソルやループがない可能性があります。T-SQLビジネスルールの計算

お客様の支払い設定で次の表を示します。

お客様は、11月分のお支払い額を知りたいと考えています。 彼らは、例えば2016年

11月15日にアカウントを閉鎖した場合:

顧客は、15 11月、2016年に自分のアカウントを閉鎖したいと、彼らはなります$量を知りたいと仮定11月1日から11月15日までお支払いください。顧客の支払いのための

計算

周波数サイクルは毎月です。 考慮に周波数を取って、我々がいることを知っている:11月の

  • カスタマー開始日が終了日が11月30日

計算式

(DayUpToCloseDate/DaysInNov) * Amount = amount customer is asking. 

DaysUpToCloseDate = 15 (diff 1st of nov and 15th of nov) 
DaysInNov = 30 
Amount = 100 
(15/30)*100 = 50 
になります11月
  • の第一になります

    お客様に、11月に50ドルをお支払いするように指示することができます11月15日の口座。

  • +0

    締め切り日はどこですか?テーブル形式がリストされていて、DATEDIFF()とEOMONTH()を簡単に使用できる日付で渡すパラメータを使用しているようです。 –

    答えて

    0

    最初に、2つの変数、問題の日付、および月額請求額を宣言する必要があります。その後、我々が使用できる期日量に月得るために

    DECLARE @date datetime = '2017-11-15' 
    DECLARE @amountDue int = 100 
    

    SELECT CAST(DATEPART(DAY,@date) AS FLOAT)/DATEPART(DAY,DATEADD(MONTH,DATEDIFF(MONTH,0,@date)+1,0)-1) * @amountDue AS [MonthToDateAmountDue] 
    

    ここでは、私たちがそこに着いた方法です。

    SELECT 
        --This gets the first day of the next month and subtracts 1 day, getting the last day of the month the date falls in. 
        DATEADD(MONTH,DATEDIFF(MONTH,0,@date)+1,0)-1 AS [LastDayOfMonth] 
        --We now extract the day date part of the last day of the month to get the total days in the month. 
        ,DATEPART(DAY,DATEADD(MONTH,DATEDIFF(MONTH,0,@date)+1,0)-1) AS [DaysInMonth] 
        --Finally, we get the day date part from our @date and divide by the total days of the month to get the percentage of the month we have completed. 
        --Since int does not do decimals, we use a float. 
        ,CAST(DATEPART(DAY,@date) AS FLOAT)/DATEPART(DAY,DATEADD(MONTH,DATEDIFF(MONTH,0,@date)+1,0)-1) AS [PercentageOfMonthCompleted] 
        --And mulitply it by the amount due. 
        ,CAST(DATEPART(DAY,@date) AS FLOAT)/DATEPART(DAY,DATEADD(MONTH,DATEDIFF(MONTH,0,@date)+1,0)-1) * @amountDue AS [MonthToDateAmountDue] 
    

    編集:私はEOMONTH機能について覚えました。これは短縮することができます

    SELECT CAST(DATEPART(DAY,@date) AS FLOAT)/DATEPART(DAY,EOMONTH(@date)) * @amountDue AS AS [MonthToDateAmountDue] 
    
    +0

    なぜselect文の戻り値が目的の数値であれば2番目の変数が必要ですか? –

    +0

    @ amountDueは1か月あたりの支払額です。返される金額は、選択日に支払われた金額です。だから、誰かがその月を通して自分の口座の一部を閉じると、1ヶ月間請求されていない。 しかし、私は混乱を参照してください。より明確に編集されています。 –

    +0

    Andrew、ありがとうございます。 2週間ごとの頻度を計算に含めるようにしてください。 I.Eでは、毎月ではなく2週間ごとに支払いが設定される可能性があります。 – John

    関連する問題