比较SQL Server中的两个日期分钟

Sor*_*ora 0 c# sql sql-server

我想做的是比较DateTime变量和sql server表中的日期,如果这两个日期之间的差异小于30分钟,则select查询将返回一些值,我正在使用c#发送DateTime变量

string query = "Select * from LoginAttempts where IP_ADDRESS='" + Ipadress + "' and ATTEMPTS<"+MaxLoginAttempts+" and (GETDATE()-LOGIN_DATE)<30";
Run Code Online (Sandbox Code Playgroud)

and (GETDATE()-LOGIN_DATE)<30 我知道这是一个错误的陈述,但应该如何解决?

Jon*_*eet 5

首先,停止像这样动态地构建SQL。请改用参数化SQL。

接下来,我想你只是想要DATEADD。如果您知道那LOGIN_DATE将永远是过去,则只需要添加30分钟,然后检查结果是否晚于GETDATE()-或等效地,从现在开始减去30分钟,再检查LOGIN_DATE是否晚于结果:

string query = @"Select * from LoginAttempts where IP_ADDRESS=@IPAddress'
                 and ATTEMPTS < @MaxLoginAttempts
                 and LOGIN_DATE > DATEADD(minute, -30, GETDATE())";
// Then fill in the parameters in the SqlCommand
Run Code Online (Sandbox Code Playgroud)

正如在评论中指出,申请DATEADDGETDATE()的而不是LOGIN_DATE允许更多的优化,因为它只需要一次,而不是一次的每一行进行,并允许任何索引LOGIN_DATE是有效的。

您可以使用DATEDIFF,而不是在这种情况下,但它是值得的注意,DATEDIFF并不总是做的正是你什么可以指望它,因为它是关于“过境通道”。这里的问题不多,但是这意味着9月1日与8月31日之间的差异为1个月,9月30日与8月1日之间的差异也为1个月。

在这种情况下,影响将是(例如)10:00:59和10:30:00被视为30分钟,尽管它们之间的距离仅略超过29分钟...而10:00之间的时差: 00和10:29:59也将是29分钟,尽管相距将近30分钟。因此,您在实际经过时间上会有些不一致。