2011-01-17 2 views
0

Мой запрос прост, но бит скручен для меня. На самом деле я работаю над модулем регистрации приложения, где регистрация истекает 31 марта каждого года. Регистрация действительна с 1 апреля по 31 марта. Поэтому всякий раз, когда пользователь регистрируется между датой, я хочу, чтобы его статус истек, если перекресток 31 марта.Запрос, чтобы проверить дату в Sql

Позвольте мне разъяснить вам.

Скажем, я зарегистрировал себя в 15Nov2010, а затем 31 марта 2011 года моя подписка будет истекла. Я хочу проверить это автоматически, поскольку годы продолжатся. Мне нужен запрос, который автоматически запросит созданную дату с датой истечения срока действия. У меня уже есть запрос select, и мне нужно встроить это условие, и я хочу проверить дату создания с текущей системной датой. Если текущая системная дата не 31 марта 12, статус должен быть активным, истек еще.

+3

Что СУБД вы используете? MySQL, SQL Server, Oracle? –

+0

База данных и версия? –

+1

Бэкэнд: -Sql Server 2008 Передняя часть - ASP.Net/C# –

ответ

2

Это может быть использовано для MS SQL, чтобы определить, было ли оно истекло или нет.

create table #t 
(
CreateDate datetime 
) 


Insert Into #t 
select GETDATE() union all 
Select DateAdd(month,4, getdate()) 

Select Case When CreateDate < getdate() And 
     Getdate() < Cast(str(DatePart(year, getdate())) + '-03-31' as datetime) Then 
     'Active' Else 'Expired' end as [Status], 
     CreateDate 

From #t 


drop table #t 

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

например

Where Case When CreateDate < getdate() And 
      Getdate() < Cast(str(DatePart(year, getdate())) + '-03-31' as datetime) Then 
      'Active' Else 'Expired' end = 'Expired' 
2

Вам нужно запланировать работу (я думаю, что они называются событиями на MySql), чтобы запускать каждый год 31 марта 11:59 и обновлять статус всех ваших учетных записей истек. (не забудьте сделать различие на счетах администратора) :)

Взгляните на это.

для MySQL

http://dev.mysql.com/tech-resources/articles/mysql-events.html#1

для SqlServer

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

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

1

Я рассматриваю таблицу YourTable и имеет столбец Date типа datetime

Вы можете использовать этот запрос -

select [Date], dbo.GetStatus([Date]) as 'status' from YourTable 

, а функция GetStatus -

CREATE FUNCTION [dbo].[GetStatus](@Date datetime) 
RETURNS varchar(10) 
AS 
BEGIN 
    DECLARE @Return varchar(10) 
    DECLARE @Year int 
    SELECT @Year = DATEPART(YYYY,GETDATE())  

    IF GETDATE() >= CONVERT(datetime,'01-APR-' + CONVERT(varchar,@Year)) 
     SET @Year = @Year + 1 

    IF @Date BETWEEN CONVERT(datetime,'01-APR-' + CONVERT(varchar,@Year-1)) AND CONVERT(datetime,'31-MAR-' + CONVERT(varchar,@Year)) 
     set @return = 'active' 
    ELSE 
     set @return = 'inactive' 

    Return @return 

END; 
1

У меня, вероятно, была бы «последняя обновленная» колонка (It первоначально будет хранить дату создания), а затем написать:

SELECT CASE WHEN 
    YEAR(DATEADD(mm, -3, LastRenewed)) < (YEAR(GETDATE()) - 1) 
    THEN 'Active' 
    ELSE 'Expired' END 
    AS Status 
    FROM TableName 

Я не вижу, что проблема с @ ответ Барри является, хотя, если честно. Если вам нужно использовать эту логику в нескольких местах, вы можете избежать повторения себя, используя, например, вид:

CREATE VIEW ActiveOrNot AS 
    SELECT Account, CASE WHEN 
     YEAR(DATEADD(mm, -3, LastRenewed)) < (YEAR(GETDATE()) - 1) 
     THEN 'Active' 
     ELSE 'Expired' END 
     AS Status 
     FROM TableName 

Затем можно выбрать только активные счета с помощью:

SELECT Account 
FROM ActiveOrNot 
WHERE Status = 'Active' 
Смежные вопросы