T-Sql业务规则计算

时间:2017-04-04 22:49:11

标签: sql sql-server tsql

我有一个复杂的问题需要在t-sql中解决。可能没有光标或循环。

根据客户的付款设置给出下表。

ID  Frequency   Amount  Start Date  End Date
1   Monthly     100     01-01-2016  N/A(ongoing)

客户想知道他将在11月份支付多少钱。 如果他们要在2016年11月15日关闭账户。

例如:

假设客户想要在2016年11月15日关闭他们的账户并想知道他们将从11月1日到11月15日支付的金额。

计算

客户付款的频率周期为每月。 考虑到频率,我们知道:

  • 11月的客户开始日期为11月1日
  • 结束日期为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月15日关闭账户,他/她将在11月支付50美元。

1 个答案:

答案 0 :(得分: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]