我要做的是比较一个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
我知道这是一个错误的陈述,但我该如何解决呢?
答案 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";