在我的数据库中,我有一张表,其中包含一些订阅信息。我有一个StartDate和一个EndDate作为DateTime。
我需要的是让Linq查询获取到期付款的所有行。付款应该在他们注册的同一天(StartDate)每月进行,并在EndDate上停止。因此,如果他们在5月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 :(得分: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;
但是,您可能希望为预付款创建新表,而是先预先计算日期。通过这种方式,您可以跟踪付款的时间,并在将来使生活更轻松。
答案 1 :(得分:2)
为什么不为所有到期付款创建单独的表格。
当取消新订阅时,您将计算该订阅的所有未来付款日期,并使用SubscriptionID,PaymentDate& amp;中添加一些行到DuePayments表中。量。
行数等于订阅开始日期和结束日期之间的月数,并且可以使用DateTime.AddMonths(1)轻松计算付款日期,同时小于结束日期。
答案 2 :(得分:1)
select
*
from
Subscription s
where
getdate() > dateadd(month, 1, isnull(s.lastBilledDate, s.StartDate) )
这样的事情应该有用。希望您在数据库中有一个显示最后一个结算日期日期的字段 - 这比使用订阅开始日期更好。
答案 3 :(得分:0)
DateTime结构上有一个AddMonths方法。
http://msdn.microsoft.com/en-us/library/system.datetime.addmonths.aspx
是的,我想我也只想到一个月的差异。
如何获取StartDate.Value.Day == DateTime.Now.Day Or的行(StartDate.Value.Day> DateTime.Now.Day和DateTime.Now.Day是该月的最后一天,无论是什么方法就是)。
答案 4 :(得分:0)
您的问题与编程无关,而是与业务相关。假设我甚至没有这个项目/产品等的计算机和软件。
如果计划从1月31日开始怎么办?我会在2月31日开账单吗?不。然后呢?我该如何计算?
最好的办法是设置一个精确的天数(假设为30天)并将其用作商业模式。自服务开始以来的第30天,您将收到费用。或类似的东西。
在T-SQL和.NET中,向DateTime添加30天没什么大不了的:
.NET:
DateTime value = DateTime.Now;
DateTime billTime = value.AddDays(30);
T-SQL:
DATEADD(DAY,30,value)