2017-05-07 128 views
1

我有以下查询SQL查询结构不返回正确的结果

SELECT eventID, description, title, event_start, event_end, userID 
FROM SIS_EVENT 
WHERE userID=1 OR (userID=0) AND 
     event_start >=01/01/2017 AND event_end <=10/10/2017 

这将工作,但只选择与1的用户ID的记录,并不会随着0

我一个用户ID返回任何感觉是像我的SQL,但我不是肯定的结构什么即时做错了 任何帮助表示赞赏

下面的代码中的SQL

SqlCommand cmd = new SqlCommand("SELECT eventID, description, title, 
event_start, event_end, userID FROM SIS_EVENT WHERE userID IN (0, @user_id) 
AND event_start >= '@start' AND event_end <= '@end' ", con); 

     cmd.Parameters.AddWithValue("@start", start); 
     cmd.Parameters.AddWithValue("@end", end); 
     cmd.Parameters.AddWithValue("@user_id", HttpContext.Current.Session["userid"]); 
+0

请标记您正在使用的DBMS(Oracle,PostgreSQL,MySQL等)。你的SQL是无效的(甚至不符合下面的代码)。 '01/01/2017'表示1除以1除以2017.''01/01/2017''会更好,但取决于数据库设置以使DBMS正确解释字符串。逻辑错误在这里:'userID = 1 OR(userID = 0 AND ...)'因为'AND'优先于'OR'。使用圆括号来解决这个问题:WHERE(userID = 1或userID = 0)AND ...'。根据数据库管理系统和数据类型的不同,你可能在'event_start'和'event_end'中可能存在时间部分问题。 –

回答

2

如果我理解你的意图,你应该写这样的查询:

SELECT eventID, description, title, event_start, event_end, userID 
FROM SIS_EVENT 
WHERE userID IN (0, 1) AND 
     event_start >= '2017-01-01' AND 
     event_end <= '2017-10-10'; 

注:

  • 日期常量应该用单引号。
  • 对于日期,您应该使用ISO标准语法(注意:在某些数据库中,您可能需要在字符串前面加上date)。
  • 使用IN进行多重比较。
+0

我在我的小管理员的查询生成器中使用过,它工作后,一旦移动到我的代码中,它将继续只检索类似于user_id的事件,而不是任何具有0的用户ID,这里会出现什么错误。我已经添加了代码 –

+0

@JamesCrozier。 。 。 'AddWithValue()'可能有问题。使用正确的类型添加参数 - 当您这样做时,您不需要在日期附近引用引号。 –

+0

我已经删除了引号和日期工作正常,但问题是它唯一的拉动数据链接到用户ID的AddwithValue(),而不是硬编码的用户ID = 0,我也需要。 –

0

我想你应该尝试在两个逻辑比较之间使用括号。

+0

SQL中没有用于比较的双等号。括号内没有使用 –

+0

感谢您通知我@Josue Martinez –

+0

您随时欢迎您@SurendraShrestha –

0

尝试使用括号来定义您的条件。 这将工作:

SELECT eventID, description, title, event_start, event_end, userID FROM SIS_EVENT WHERE (userID=1 OR userID=0) AND event_start >=01/01/2017 AND event_end <=10/10/2017 

或者作为条件是同一列,你可以用“IN”:

SELECT eventID, description, title, event_start, event_end, userID FROM SIS_EVENT WHERE (userID=1 OR userID=0) AND event_start >= 01/01/2017 AND event_end <= 10/10/2017; 
0

第一您的问题是,你把那个打开的条件或条件 进入 - >是用户id等于1或其余
和有关的比较需要的日期时间这里的一些转换是我的代码的改进:

SELECT eventID, description, title, event_start, event_end, userID 
     FROM SIS_EVENT 
     WHERE userID IN (0, 1) AND 
      Convert(DateTime, event_start) >=Convert(DateTime,'2017-01-01',106) AND 
      Convert(DateTime, event_end) <=Convert(DateTime,'2017-10-10',106);