c#日期范围之间的退款

时间:2012-07-27 09:17:48

标签: c# .net sql sql-server linq

基本上我有以下帐户的发票行,如下所示:

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中需要一个函数来提供这个结果。任何帮助,将不胜感激。提前谢谢。

2 个答案:

答案 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

SQL Fiddle Demo

答案 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

请注意,我在这里做了一些假设:

  1. 示例输出中的最后一行是错误的 - 范围是12/12/2012到14/12/2012(示例中的天数是正确的,但是(2)。

  2. @from必须小于@to才能使此代码正常工作 - 但无论如何你应该检查一下。

  3. 您希望在T-SQL中完成此操作。它不是很整洁,C#在这方面要好得多(最小,最大方法和日期操作)。