我想做的是比较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
我知道这是一个错误的陈述,但应该如何解决?
首先,停止像这样动态地构建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)
正如在评论中指出,申请DATEADD
到GETDATE()
的而不是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分钟。因此,您在实际经过时间上会有些不一致。
归档时间: |
|
查看次数: |
3301 次 |
最近记录: |