查询以检查Sql中的日期

时间:2011-01-17 16:54:39

标签: asp.net sql sql-server-2008

我的查询简单但有点扭曲。实际上我正在开发应用程序的注册模块,注册表每年3月31日到期。注册有效期为4月1日至3月31日。因此,只要用户在该日期之间进行了注册,我希望如果超过3月31日,他的状态将会过期。

让我向你说清楚。

说我已经在15Nov2010注册了自己,然后在2011年3月31日,我的订阅将过期。随着岁月的流逝,我想自动检查它。我需要一个查询,它将自动查询创建日期和截止日期。我已经有一个选择查询,我需要嵌入这个条件,我想检查创建日期与当前系统日期。如果当前系统日期不是3月31日午夜12,则状态必须处于活动状态,否则将过期。

4 个答案:

答案 0 :(得分:1)

您需要的是安排一份工作(我认为他们被称为MySql上的事件)每年3月31日11:59运行,并且更新将您所有帐户的状态设置为已过期。 (记得在管理员帐户上制作dstinction):)

看看这个。

for 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 :(得分:1)

这可以用于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

要过滤查询,只需将case语句移动到where子句

即可

e.g。

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

答案 2 :(得分:0)

我正在考虑一个表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;

答案 3 :(得分:0)

我可能有一个“最后续订”栏目(它最初将存储创建日期)然后写:

SELECT CASE WHEN 
    YEAR(DATEADD(mm, -3, LastRenewed)) < (YEAR(GETDATE()) - 1) 
    THEN 'Active'
    ELSE 'Expired' END 
    AS Status
    FROM TableName
但是,老实说,我不知道@ Barry的回答是什么问题。如果您需要在多个地方使用此逻辑,则可以避免使用视图重复自己,例如:

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'