2013-04-23 72 views
0

我想只有sql值在datetime的值介于2个值之间。日期时间在2个日期时间值之间的行SQL

我使用此代码

filterdatum = "(Datum >= "+ startwaarde + " AND Datum < "+ eindwaarde+ ")"; 
filter = filter + " AND " + filterdatum; 

我的过滤器将是这样的:

where "(Type like '%13%') AND (Datum >= 11/04/2013 00:00:00 AND Datum < 23/04/2013 00:00:00)" 

我总是得到这样的错误:

Incorrect syntax near '00'.

+2

将单引号之间的日期之间的位置 – noobob 2013-04-23 07:48:09

+2

这对SQL注入是开放的。使用参数 – gbn 2013-04-23 07:50:04

+0

@noobob,这个评论应该可以说是一个回答,而不是评论,因为你是完全正确的;) – 2013-04-23 07:50:22

回答

2

确保您引用DateTime是否,否则你的SQL可能认为他们是表/列名?

+0

然后我必须如何放置我的报价? – user2282583 2013-04-23 07:49:59

+0

查看noobob的回答。 – Davio 2013-04-23 07:53:33

4

将单引号之间的日期:

filterdatum = "(Datum >= '"+ startwaarde + "' AND Datum < '"+ eindwaarde+ "')"; 
filter = filter + " AND " + filterdatum; 

提示:一个简单的测试,你可以做下一次是直接在你的数据库执行查询,并检查是否正常工作。

2

您应该在日期值之间使用单引号。

filterdatum = "(Datum >= '"+ startwaarde + "' AND Datum < '"+ eindwaarde+ "')"; 

但更重要的是,你应该总是使用parameterized queries,这种代码是开放的SQL Injection攻击。

例如;

SqlConnection conn = new SqlConnection(_connectionString); 
conn.Open(); 
string s = "SELECT * From YourTable WHERE Datum >= @startwaarde AND Datum < @eindwaarde"; 
SqlCommand cmd = new SqlCommand(s); 
cmd.Parameters.Add("@startwaarde", startwaarde); 
cmd.Parameters.Add("@eindwaarde", eindwaarde); 
SqlDataReader reader = cmd.ExecuteReader(); 
+0

只是提到他没有指定如果这是一个ADO命令或网格过滤器或类似的东西。对? – noobob 2013-04-23 08:00:52

+0

@noobob当然是的..但他无论使用哪种技术都无所谓,他应该始终参数化他的查询。 – 2013-04-23 08:05:08

3

更好的选择是将日期值作为参数传递给查询。将日期值直接放入查询字符串中始终存在问题。创建和传递参数的确切代码取决于您的数据访问技术。

如果使用ADO.NET,你应该写:

filterdatum = "(Datum >= @startDate AND Datum < @endDate)"; 
... 
command.Parameters.AddWithValue("@startDate", startwaarde); 
command.Parameters.AddWithValue("@endDate", eindwaarde); 
0
  1. 将引号之间的日期/时间值。
  2. 确保您的日期/时间值格式符合ISO 8601。您可以使用startwaarde.ToString("o")来做到这一点,假设startwaarde是DateTime类型。
  3. 最好的方法是使用参数。因此,您的SQL将如下所示:(Datum >= @1 AND Datum < @2),并将这两个值作为参数添加到SqlCommand,假设您正在过滤数据库。
相关问题