2

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

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

4

2 回答 2

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 小提琴演示

于 2012-07-27T09:38:33.063 回答
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# 在这方面要好得多(最小、最大方法和日期操作)。

于 2012-07-27T09:49:12.553 回答