Прошел месяц? - PullRequest
       41

Прошел месяц?

4 голосов
/ 23 мая 2009

В моей базе данных есть таблица с информацией о подписке. У меня есть, среди прочего, StartDate и EndDate как DateTime.

Мне нужно сделать запрос Linq, получающий все строки для оплаты. Предполагается, что оплата происходит каждый месяц в тот же день, когда они зарегистрированы (StartDate), и прекращается на EndDate. Поэтому, если они зарегистрировались 23 мая, мне нужно снова выставить им счет 23. 23 июня, 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 ]

3 голосов
/ 23 мая 2009

Один из способов обработки дней пролонгации месяца (при условии, что вы хотите выставить счет в последний день месяца в нечетном случае):

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;

Возможно, вы захотите создать новую таблицу для срочных платежей и рассчитать даты заранее. Таким образом, вы можете следить за тем, когда производятся платежи, а также облегчать жизнь в будущем.

2 голосов
/ 23 мая 2009

Почему бы вам не создать отдельную таблицу для всех причитающихся платежей.

Когда новая подписка отменяется, вы должны рассчитать все будущие даты платежей для этой подписки и добавить количество строк в таблицу DuePayments с SubscriptionID, PaymentDate & Amount.

Количество строк будет равно количеству месяцев между датой начала подписки и датой окончания, а даты платежа могут быть легко рассчитаны с использованием DateTime.AddMonths (1), но меньше даты окончания.

1 голос
/ 23 мая 2009
select
    *
from
   Subscription s
where
   getdate() > dateadd(month, 1, isnull(s.lastBilledDate, s.StartDate) )

Нечто подобное должно работать. Надеюсь, у вас есть поле в базе данных, где отображается дата последней выставленной даты, которую лучше использовать, чем дату начала подписки.

0 голосов
/ 24 мая 2009

Ваша проблема не связана исключительно с программированием, а связана с бизнесом. Предположим, у меня даже нет компьютера и программного обеспечения для этого проекта / продукта / и т. Д.

Что если план начнется 31 января? Буду ли я выставлять им счета 31 февраля? Не. Тогда, когда? Как мне вычислить?

Что ж, лучше всего было бы установить точное количество дней (скажем, 30) и использовать это в качестве бизнес-модели. На 30-й день с момента запуска услуги вам будет выставлен счет. Или что-то вроде этого.

В T-SQL и .NET добавление 30 дней к DateTime не представляет особой проблемы:

.NET:

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

T-SQL:

DATEADD(DAY,30,value)
0 голосов
/ 23 мая 2009

Существует метод AddMonths в структурах DateTime.

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 - последний день месяца, независимо от метода за что бы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...