【问题标题】:Query to check Date in Sql查询以检查 Sql 中的日期
【发布时间】:2011-01-17 16:54:38
【问题描述】:

我的查询很简单,但对我来说有点扭曲。实际上我正在开发一个应用程序的注册模块,每年的 3 月 31 日注册到期。注册有效期为 4 月 1 日至 3 月 31 日。因此,每当用户在此日期之间注册时,如果超过 3 月 31 日,我希望他的状态过期。

让我更清楚地告诉你。

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

【问题讨论】:

  • 您使用的是什么 DBMS? MySQL、SQL Server、Oracle?
  • 后端:-Sql Server 2008 前端是ASP.Net/C#
  • 这不是说不提前过年(或假记录),每年4月1日午夜每个人都会失效吗??
  • 其实这背后的逻辑和Insurance Policies是一样的,可以说是有效期一年,满一年就失效了。但是这里的条件有些固定,只要您在当年的 4 月 1 日至来年的 3 月 31 日期间注册,您将在来年的 3 月 31 日到期,除非您续订帐户。如果您续订帐户,有效期至明年 3 月 31 日
  • @AmRan - 不要忘记将赏金奖励给答案。感谢您的接受

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


【解决方案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 子句

例如

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

【讨论】:

    【解决方案2】:

    您需要安排一个工作(我认为它们被称为 MySql 上的事件)在每年 3 月 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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我可能会有一个“最后更新”列(它最初会存储创建日期)然后写:

        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'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-06
          • 2021-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多