已经过了一个月了?
在我的数据库中,我有一个表格,里面有一些订阅信息。除此之外,我还有一个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
为什么不为所有到期付款创建一个单独的表。
当新订阅被取出时,您将计算该订阅的所有未来付款日期,并使用SubscriptionID,PaymentDate &金额将许多行添加到DuePayments表中。
行数等同于订阅开始日期和结束日期之间的月数,并且支付日期可以使用DateTime.AddMonths(1)轻松计算,但小于结束日期。
+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))
类似的东西应该工作。希望您在数据库中有一个显示上次结算日期日期的字段 - 这比使用订阅开始日期更适合使用。
这只适用于他们的第一次付款。如果他们已经订阅了2个月或更长时间会怎么样? – 2009-05-23 18:13:55
然后,您需要将其帐户余额纳入该条件,或者使用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)
我认为这是一个业务需求的问题。你想怎么处理? – 2009-05-23 18:07:24