基本上我有以下帐户的发票行,如下所示:
BillID AccountID BilledFrom BillTo Days Price
38 3456 10/10/2012 10/11/2012 30 86p
39 3456 11/11/2012 11/12/2012 30 87p
40 3456 12/12/2012 30/12/2012 18 81p
用户希望退还客户的部分日期范围,因此用户需要输入日期和日期:
Date From: 18/10/2012 DateTo: 14/12/2012
这将导致信用额度退还给客户计算每条线的日期和价格。我需要返回每一行并显示截止点。如您所见,输入的范围跨越3个发票行。
所需的结果是:
BillID AccountID BilledFrom BillTo RangeStart RangeEnd Days Price
38 3456 10/10/2012 10/11/2012 18/10/2012 10/11/2012 22 86p
39 3456 11/11/2012 11/12/2012 11/11/2012 11/12/2012 30 87p
40 3456 12/12/2012 30/12/2012 11/11/2012 11/12/2012 2 81p
结果基本上会带回初始适用的发票行,但要计算出这个范围的拟合程度,并根据输入的日期范围计算账单的天数和账单。
我在SQL中需要一个函数来提供这个结果。任何帮助,将不胜感激。提前谢谢。
答案 0 :(得分:3)
试试这个:
declare @DateFrom date='10/18/2012'
declare @DateTo date='12/14/2012'
select T.BillID,T.AccountID,T.BilledFrom,T.BillTo,
case when BilledFrom<@DateFrom then @DateFrom else BilledFrom end [RangeStart],
case when BillTo<@DateTo then BillTo else @DateTo end [RangeEnd],DATEDIFF(D,case when BilledFrom<@DateFrom then @DateFrom else BilledFrom end ,case when BillTo<@DateTo then BillTo else @DateTo end ) [Days],Price
from t_account T
答案 1 :(得分:2)
纯T-SQL答案如下(假设一个名为InvoiceLine的表,其中包含文本中指定的列):
declare @from datetime
declare @to datetime
set @from = '2012-10-18'
set @to = '2012-12-14'
select
BillID, AccountID, BilledFrom, BillTo,
case when datediff(d, @from, BilledFrom)>0 then BilledFrom else @from end [RangeStart],
case when datediff(d, BillTo, @to)>0 then BillTo else @to end [RangeEnd],
[days]
+case when datediff(d, @from, BilledFrom)>0 then 0 else datediff(d, @from, BilledFrom) end
+case when datediff(d, BillTo, @to)>0 then 0 else datediff(d, BillTo, @to) end [Days],
Price
From InvoiceLine
请注意,我在这里做了一些假设:
示例输出中的最后一行是错误的 - 范围是12/12/2012到14/12/2012(示例中的天数是正确的,但是(2)。
@from必须小于@to才能使此代码正常工作 - 但无论如何你应该检查一下。
您希望在T-SQL中完成此操作。它不是很整洁,C#在这方面要好得多(最小,最大方法和日期操作)。