已经过了一个月了?

问题描述:

在我的数据库中,我有一个表格,里面有一些订阅信息。除此之外,我还有一个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

为什么不为所有到期付款创建一个单独的表。

当新订阅被取出时,您将计算该订阅的所有未来付款日期,并使用SubscriptionID,PaymentDate &金额将许多行添加到DuePayments表中。

行数等同于订阅开始日期和结束日期之间的月数,并且支付日期可以使用DateTime.AddMonths(1)轻松计算,但小于结束日期。

+0

+1同意。这样每次付款都有计划,有自己的发票号码,并且更容易跟踪。当审计师来到时,应该考虑什么是最好的。 – 2009-05-23 18:30:23

上有日期时间结构的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是本月的最后一天,无论方法就是这样)。

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

一个处理一个月侧翻天的方法是(假设想要向他们在每月的最后一天,在奇数的情况下):

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; 

您可能希望创建的应付款项的新表并且预先计算日期,但是。通过这种方式,您可以跟踪付款的时间以及将来的生活。

你的问题不是严格的程序设计相关,而是与业务相关。假设我甚至没有计算机和该项目/产品等的软件。

如果计划在1月31日开始,该怎么办?我会在二月三十一日开帐单吗?不。那什么时候?我如何计算?

那么最好的办法是设置一个精确的天数(比如说30)并将其用作商业模型。在服务开始后的第30天,您将收到账单。或者类似的东西。

在T-SQL和.NET增加30天日期时间没什么大不了:

。NET:

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

T-SQL:

DATEADD(DAY,30,value)