2017-05-07 129 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);