Sql 如何删除超过30秒且具有空值的条目

Sql 如何删除超过30秒且具有空值的条目,sql,tsql,datetime,Sql,Tsql,Datetime,目标: 删除所有条目,其中上次登录为空且注册日期早于30秒 我正在尝试使用transact-SQL从表“ONE”中删除一个条目 SELECT * FROM dbo.ONE WHERE LastLogin == Null AND RegDate is older than DATETIME.NOW by 30 seconds; 我希望这个问题有意义。那么,我将如何实现这一目标 正如@Alex K.指出的,检查null并使用datediff select * from dbo.ONE where

目标:
删除所有
条目
,其中
上次登录
注册日期
早于30秒

我正在尝试使用transact-SQL从表“ONE”中删除一个条目

SELECT * 
FROM dbo.ONE
WHERE LastLogin == Null AND RegDate is older than DATETIME.NOW by 30 seconds;

我希望这个问题有意义。那么,我将如何实现这一目标

正如@Alex K.指出的,检查null并使用datediff

select * from dbo.ONE where LastLogin is NULL and  
                            datediff(ss,regdate,GetDate())<30
select*from dbo.ONE,其中LastLogin为NULL,并且

datediff(ss,regdate,GetDate())正如@Alex K所指出的,检查null并使用datediff

select * from dbo.ONE where LastLogin is NULL and  
                            datediff(ss,regdate,GetDate())<30
select*from dbo.ONE,其中LastLogin为NULL,并且

datediff(ss,regdate,GetDate())我不能100%确定您所指的旧部件
。但应该是这样的

DELETE FROM dbo.ONE
WHERE LastLogin IS NULL
  AND RegDate < DATEADD(ss, -30, getdate());
从dbo.ONE删除
其中LastLogin为NULL
和RegDate

getdate()是当前时间

我不能100%确定您所指的旧部件
。但应该是这样的

DELETE FROM dbo.ONE
WHERE LastLogin IS NULL
  AND RegDate < DATEADD(ss, -30, getdate());
DELETE FROM dbo.ONE WHERE LastLogin  IS NULL AND  datediff(second, RegDate,GetDate()) > 30;
从dbo.ONE删除
其中LastLogin为NULL
和RegDate


getdate()是当前时间

DATEDIFF()
要计算年龄,
DELETE FROM
要删除并使用
为NULL
=NULL
请选择*DELETE FROM dbo。其中LastLogin为NULL,并且…-像这样吗?我警告不要删除数据,除非你能保证引用的完整性可以得到维护。我会做一个更新,其中某些列(最好是活动的或有效的EndDate)被标记为“禁用”或“不活动”。@EastOfJupiter我非常怀疑记录登录的表是否有PK,让一个单独的FK连接到另一个表。非常确定他们保留了一个RegDate,然后登录就没有完成。我假设这是一个注册用户表-其中PK是用户ID。
DATEDIFF()
用于计算年龄,
DELETE FROM
删除并使用
为NULL
=NULL
选择*DELETE FROM dbo。其中LastLogin为NULL并…-像这样吗?我警告不要删除数据,除非你能保证引用的完整性可以得到维护。我会做一个更新,其中某些列(最好是活动的或有效的EndDate)被标记为“禁用”或“不活动”。@EastOfJupiter我非常怀疑记录登录的表是否有PK,让一个单独的FK连接到另一个表。非常确定他们保留了一个RegDate,然后登录就没有完成。我假设这是一个注册用户表,其中PK是UserID。它返回正确的行,如果为空,但如果我包括时差检查,它将不返回任何内容。日期是2016-05-04 14:48:46.643,大于30秒。值得注意的是,(到目前为止)这是唯一使用谓词的解决方案(即可以使用
RegDate
上的索引),所以我很惊讶它没有更多的投票,我看不出DATEADD部分有任何问题-它在我的测试中运行良好:
SELECT*FROM(值(1,CONVERT(DATETIME2,'2016-05-04 14:48:46.643'),(2,SYSDATETIME()))t(ID,DT),其中DT
尝试
选择DATEADD(SS,-30,GETDATE())并查看您得到的结果。正如@GerethD所说,使用
DATEADD
可以创建一个常量值,并使用索引快速与
RegDate
进行比较。使用
DATEDIFF
您必须对每一行执行该函数,并且不能使用索引。我只是意识到您可能需要
而不是
,它返回正确的行,因为它为空,但是如果我包括时差检查,那么它将不返回任何内容。日期是2016-05-04 14:48:46.643,大于30秒。值得注意的是,(到目前为止)这是唯一使用谓词的解决方案(即可以使用
RegDate
上的索引),所以我很惊讶它没有更多的投票,我看不出DATEADD部分有任何问题-它在我的测试中运行良好:
SELECT*FROM(值(1,CONVERT(DATETIME2,'2016-05-04 14:48:46.643'),(2,SYSDATETIME()))t(ID,DT),其中DT
尝试
选择DATEADD(SS,-30,GETDATE())并查看您得到的结果。正如@GerethD所说,使用
DATEADD
可以创建一个常量值,并使用索引快速与
RegDate
进行比较。使用
DATEDIFF
您必须对每一行执行该功能,并且不能使用索引。我刚刚意识到,可能您需要
而不是
此功能非常有效,请将选择*更改为删除。Hmm在此日期不起作用:2016-05-04 14:38:12.857,我现在的时间是2016-05-04 15:44…我希望你改变的选择多于删除,因为< 30将删除少于30秒的行。也许我误解了,替换< >如果你想清除从当前时间超过30秒的记录,你可能想考虑制作<代码>哪里子句,以便它可以从索引中受益。不要为每行计算一个值,而是将行值与单个计算值进行比较:
RegDate
。(琐事:奇怪的是
GetDate()
被视为查询中的一个。)这很好用,从SELECT*改为DELETE from。这个日期不起作用:2016-05-04 14:38:12.857,我现在的时间是2016-05-04 15:44…我希望你比SELECT改为DELETE更多,因为<30将在30秒内删除行。也许我误解了,如果您想清除当前时间超过30秒的记录,您可能需要考虑将<>代码> 子句,以便它可以从索引中受益。不要为每行计算一个值,而是将行值与单个计算值进行比较:
RegDate
。(
DELETE FROM dbo.ONE WHERE LastLogin  IS NULL AND  datediff(second, RegDate,GetDate()) > 30;