c # Remboursement entre plages de dates

Fondamentalement, j'ai une ligne de facture pour un count ci-dessous:

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 

L'user souhaite rembourser le client pour une période partielle, l'user devra donc entrer une date et une date à ce jour:

 Date From: 18/10/2012 DateTo: 14/12/2012 

Cela entraînera des lignes de crédit pour rembourser le client travaillant sur les jours et le prix pour chaque ligne. Je dois returnner chaque ligne et montrer les points de coupure. Comme vous pouvez le voir, les plages saisies couvrent les trois lignes de facture.

Le résultat nécessaire est:

 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 

Les résultats ramèneront fondamentalement la ligne de facturation initiale applicable, mais détermineront comment cette gamme s'adapte et calcule les jours contre la facture et la facture à partir de la plage de dates input.

J'ai besoin d'une fonction soit en SQL pour fournir ce résultat. Toute aide serait appréciée. Merci d'avance.

essaye ça:

  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 

Démo de Fiddle SQL

Une réponse T-SQL pure serait la suivante (en supposant une table nommée InvoiceLine avec les colonnes comme spécifié dans votre text):

 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 

Notez que je fais quelques hypothèses ici:

  1. La dernière ligne de votre exemple de sortie est erronée – la plage va du 12/12/2012 au 14/12/2012 (le nombre de jours dans votre exemple est correct, cependant (2).

  2. @from doit être inférieur à @to pour que ce code fonctionne, mais vous devriez le vérifier quand même.

  3. Vous voulez que cela soit fait en T-SQL. Ce n'est pas très soigné, et C # est bien meilleur (methods min et max et manipulation de date).