所以,我是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
感谢您的任何帮助。谢谢。
答案 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())
第一个计算两个日期之间的月差异数。第二个减去当前日期的三个月。根据你问题中的文字,你真的想要第二个版本。