【问题标题】:c# Refunding between date rangesc# 日期范围之间的退款
【发布时间】:2012-07-27 09:17:47
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    试试这个:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 2017-12-20
        • 1970-01-01
        相关资源
        最近更新 更多