在每个记录sql server上工作

时间:2017-09-12 10:44:57

标签: sql sql-server

所以,我是microsoft sql server的新手。

我有一个名为login credentials

的表格
id | name | l_date  | status
1  | aa   |1.2.2017 | active

所以我要做的就是找到与当前日期相差3个月并将其设置为无效的人。

例如: 以上l_date为1.2.2017且当前为12.09.2017,有三个月的差距,因此请将其设置为无效。

我尝试了什么。

USE databasename
GO

CREATE PROCEDURE dbo.datediffer 
AS
DECLARE @LastChangeDate as date
declare @current as date
declare @datediffernce as int


DECLARE @MyCursor CURSOR;
DECLARE @MyField ;
BEGIN
    SET @MyCursor = CURSOR FOR
    select *  from dbo.table_name

    OPEN @MyCursor 
    FETCH NEXT FROM @MyCursor 
    INTO @MyField

    WHILE @@FETCH_STATUS = 0
    BEGIN
      SET @current=GetDate()
      SET @datediffernce=datediff(mm, @LastChangeDate , @current)
      //Something here , i cant seem to get the l_date and make some algo on it and then change its status.
      FETCH NEXT FROM @MyCursor 
      INTO @MyField 
    END; 

    CLOSE @MyCursor ;
    DEALLOCATE @MyCursor;
END;

GO

感谢您的任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

使用sql server时,如果你发现自己使用游标,那么你可能做错了!

UPDATE [login credentials]
SET status = 'inactive'
WHERE datediff(mm,l_date,getdate())>=3

答案 1 :(得分:1)

为什么不使用update

update login_credentials
    set status = 'inactive'
    where l_date < dateadd(month, 3, getdate());

使用基于集合的操作比使用游标要好得多。性能不仅更好,而且代码更短,更易于编写,更易于理解。

此版本允许数据库利用login_credentials(l_date)上的索引。你应该知道这些做了不同的事情:

datediff(month, @LastChangeDate , @current)
l_date < dateadd(month, 3, getdate())

第一个计算两个日期之间的月差异数。第二个减去当前日期的三个月。根据你问题中的文字,你真的想要第二个版本。