有一个月过去了吗?

时间:2009-05-23 18:02:22

标签: c# .net linq-to-sql

在我的数据库中,我有一张表,其中包含一些订阅信息。我有一个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

5 个答案:

答案 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)