2010-01-25 1 views
0

У меня есть таблица, которая представляет подписку пользователя на нашу систему. У меня две таблицы. Один представляет собой подписку на учетную запись, а другой - тип подписки. Таблица подписки относится к таблице типа подписки с полем subscriptionTypeID в таблице типов подписки. Мне нужно выяснить оставшиеся дни для этой учетной записи. Вот мой пример:SQL вычисляет оставшиеся дни на основе интервала дней (с использованием SQL Server 2005)?

Пользователь зарегистрировался 1 января 2010 года и их срок составляет 30 дней. На основании сегодняшней даты (25 января 2010 г.) у них осталось бы 6 дней.

Мне нужна помощь в разработке SQL. Вот то, что я до сих пор в моей хранимой процедуре:

@SubscriptionTypesID int 

Declare @term int 
Declare remainder int 
Set @term = (SELECT subscriptionTerm 
     FROM dbo.SubscriptionTypes 
     where dbo.SubscriptionTypes.SubscriptionTypesID = @SubscriptionTypesID) 

Теперь мне нужно, чтобы выяснить, что делать с запросом остатка, или если я могу как-то один SQL заявление, поэтому у меня нет, чтобы получить термин отдельно.

Update:

Вот что я теперь получил всю вашу помощь, но я все равно хочу более elgant способ накачать термин значение поля в запросе:

Select (DateDiff(day,getDate(),DATEADD (day , 30, '01/01/2010'))) days 

Update 2.0;)

Иногда ответ прямо передо мной, и я даже не вижу его. Я склонен к проблемам мысли и усложнять их, чем они должны быть. Спасибо всем, кто помог! HEre - это код:

SELECT (DateDiff(day,getDate(),DATEADD (day , subscriptionTerm, dbo.Subscriptions.subscriptionDate))) days 
FROM 
    dbo.Subscriptions 
    INNER JOIN dbo.SubscriptionTypes ON (dbo.Subscriptions.subscriptionTypeID = dbo.SubscriptionTypes.SubscriptionTypesID) 
WHERE 
    dbo.Subscriptions.userID = 129 

ответ

1

Err, почему бы вам просто не сравнить текущую дату с датой подписки +30 дней? Я считаю, что это будет выглядеть как

if(GETDATE() > DATEADD(day,30,@SubscriptionDate)) 
BEGIN 

END 

В комментариях ниже вы спросили, как получить количество дней. SQL имеет метод, который ...

SELECT DATEDIFF(datepart,start,end) 

Чтобы получить значение и использовать его в различных местах, вы можете использовать следующий синтаксис:

DECLARE @Difference int 
SELECT @Difference = DATEDIFF(day,@SubscriptionDate,GETDATE()) 
+0

Да, но каждый тип подписки может иметь свой собственный термин. Каким будет самый элегантный способ скомпоновать поле term с текущей датой даты/подписки? Кроме того, я хотел бы получить количество дней назад, я должен использовать его для другого процесса, например автоматизированные электронные письма, сообщающие, что абонент подписывает подписку. – DDiVita

+0

Вы хотите проверить все свои записи сразу или одну конкретную запись за раз? –

1

Вы можете использовать Datadiff функциональность от SQL:

http://msdn.microsoft.com/en-us/library/ms189794.aspx

Вы также могли бы решить эту проблему с помощью:

DATEADD (datepart , number, date) 

Вы можете найти больше в одной и той же странице MSDN, просто использовать SearchBox и типа «DATEADD»

удачи с вашим оставшегося времени штучка;)

0

Вот это ... Спасибо всем за проницательность:

SELECT (DateDiff(day,getDate(),DATEADD (day , subscriptionTerm, dbo.Subscriptions.subscriptionDate))) days 
FROM 
    dbo.Subscriptions 
    INNER JOIN dbo.SubscriptionTypes ON (dbo.Subscriptions.subscriptionTypeID = dbo.SubscriptionTypes.SubscriptionTypesID) 
WHERE 
    dbo.Subscriptions.userID = 129