2012-07-27 75 views
2

基本上我有一个低于帐户如下发票行:C#包退范围

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

回答

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

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. 在你的例子输出的最后一行是错误的 - 范围二零一二年十二月一十二日到14/12/2012(天的在您的示例的号码是正确的,但是,(2)。

  2. @from必须小于@至该代码工作 - 但你应该检查反正。

  3. 你想这在T-SQL来完成。它不是很整洁,而且C#在这方面更好(最小,最大方法和日期操作)。