我有一个复杂的问题需要在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日支付的金额。
计算
客户付款的频率周期为每月。 考虑到频率,我们知道:
计算公式
(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美元。
答案 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]