比较sql server中的两个日期分钟

时间:2014-02-15 08:21:58

标签: 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";

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

2 个答案:

答案 0 :(得分:4)

首先,动态停止构建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

正如评论中所述,将DATEADD应用于GETDATE()代替LOGIN_DATE可以实现更多优化,因为它只需要执行一次而不是每行执行一次,并允许任何LOGIN_DATE上的索引才有效。

在这种情况下,您可以使用DATEDIFF,但值得注意的是DATEDIFF并不总是完全按照可能期望的那样做,因为它是关于“过境点”。这里没什么问题,但这意味着(比如)9月1日到8月31日之间的差异是1个月,9月30日和8月1日之间的差异也是如此。

在这种情况下,影响只是(比方说)10:00:59和10:30:00将被视为30分钟,尽管他们仅仅 超过29分钟。 ..而10:00:00和10:29:59之间的差异也是29分钟,尽管相隔差不多30分钟。所以你在实际经过的时间方面会略微不一致。

答案 1 :(得分:2)

试试这个:

DATEDIFF(MINUTE, GETDATE(), LOGIN_DATE)

所以整个查询看起来像这样:

string query = "Select * from LoginAttempts where IP_ADDRESS='" + Ipadress + "' 
and ATTEMPTS<"+MaxLoginAttempts+" and DATEDIFF(MINUTE, GETDATE(), LOGIN_DATE)<30";