2009-05-23 101 views
4

在我的數據庫中,我有一個表格,裏面有一些訂閱信息。除此之外,我還有一個StartDate和一個EndDate作爲DateTime。已經過了一個月了?

我需要的是讓一個Linq查詢獲取付款的所有行。付款應該在他們註冊的同一天的每個月發生(StartDate)並在EndDate中停止。因此,如果他們在23日註冊,我需要再次向他們發票23. 6月23日,7月23日等。

var query = from c in db.Subscription 
      where c.StartDate.Value.Day == DateTime.Now.Day 
      // What if today is Feb. 28 and a customer registered January 31. 
      // What if.... 

我迷路了...請幫忙!

最佳, 喬恩2H

+0

我認爲這是一個業務需求的問題。你想怎麼處理? – 2009-05-23 18:07:24

回答

2

爲什麼不爲所有到期付款創建一個單獨的表。

當新訂閱被取出時,您將計算該訂閱的所有未來付款日期,並使用SubscriptionID,PaymentDate &金額將許多行添加到DuePayments表中。

行數等同於訂閱開始日期和結束日期之間的月數,並且支付日期可以使用DateTime.AddMonths(1)輕鬆計算,但小於結束日期。

+0

+1同意。這樣每次付款都有計劃,有自己的發票號碼,並且更容易跟蹤。當審計師來到時,應該考慮什麼是最好的。 – 2009-05-23 18:30:23

0

上有日期時間結構的AddMonths方法。

http://msdn.microsoft.com/en-us/library/system.datetime.addmonths.aspx

是啊,我想我是那種想只有一個月的差別太大。

什麼斂行,其中StartDate.Value.Day == DateTime.Now.Day或(StartDate.Value.Day> DateTime.Now.Day而DateTime.Now.Day是本月的最後一天,無論方法就是這樣)。

1
select 
    * 
from 
    Subscription s 
where 
    getdate() > dateadd(month, 1, isnull(s.lastBilledDate, s.StartDate)) 

類似的東西應該工作。希望您在數據庫中有一個顯示上次結算日期日期的字段 - 這比使用訂閱開始日期更適合使用。

+0

這隻適用於他們的第一次付款。如果他們已經訂閱了2個月或更長時間會怎麼樣? – 2009-05-23 18:13:55

+0

然後,您需要將其帳戶餘額納入該條件,或者使用last_billed日期字段而不僅僅是開始日期。 – 2009-05-23 18:16:17

3

一個處理一個月側翻天的方法是(假設想要向他們在每月的最後一天,在奇數的情況下):

var Tomorrow = DateTime.Today.AddDays(1); 

var query = from c in db.Subscription 
      where c.EndDate.Value > DateTime.Today && 
        (c.StartDate.Value.Day == DateTime.Today.Day || 
        (Tomorrow.Month > DateTime.Today.Month && 
        c.StartDate.Value.Day > DateTime.Today.Day)) 
      select c; 

您可能希望創建的應付款項的新表並且預先計算日期,但是。通過這種方式,您可以跟蹤付款的時間以及將來的生活。

0

你的問題不是嚴格的程序設計相關,而是與業務相關。假設我甚至沒有計算機和該項目/產品等的軟件。

如果計劃在1月31日開始,該怎麼辦?我會在二月三十一日開帳單嗎?不。那什麼時候?我如何計算?

那麼最好的辦法是設置一個精確的天數(比如說30)並將其用作商業模型。在服務開始後的第30天,您將收到賬單。或者類似的東西。

在T-SQL和.NET增加30天日期時間沒什麼大不了:

。NET:

DateTime value = DateTime.Now; 
DateTime billTime = value.AddDays(30); 

T-SQL:

DATEADD(DAY,30,value)