2012-04-03 50 views
0

我有這些地方PARAMS,但它不返回所期望的:修改MySQL的WHERE PARAMS

WHERE `Profiles`.`Departure1` >= '2012-04-01' 
OR `Profiles`.`Departure2` >= '2012-04-01' 
OR `Profiles`.`Departure3` >= '2012-04-01' 
AND `Profiles`.`Departure1` <= '2012-04-04' 
OR `Profiles`.`Departure2` <= '2012-04-04' 
OR `Profiles`.`Departure3` <= '2012-04-04' 

有三個出發日期字段,我想只返回條目,其中兩者之間的日期的土地日期。我在這裏得到的是回報一切。有沒有更好的方法來做到這一點,可能實際上工作?

+0

有點不清楚。 '日期'意思是今天的日期?你也提到3個日期,但是說'在兩個日期之間'。哪兩個? – 2012-04-03 15:34:46

回答

3

使用適當的括號:

WHERE ((`Profiles`.`Departure1` >= '2012-04-01' 
OR `Profiles`.`Departure2` >= '2012-04-01' 
OR `Profiles`.`Departure3` >= '2012-04-01') 
AND (`Profiles`.`Departure1` <= '2012-04-04' 
OR `Profiles`.`Departure2` <= '2012-04-04' 
OR `Profiles`.`Departure3` <= '2012-04-04')) 
0

有很多方法可以讓這個更清潔,但我一直是長手以示與上述查詢的問題。

您需要在出發日期集之間建立鏈接,上面的範圍太廣泛。

WHERE(ProfilesDeparture1> = '2012-04-01' AND ProfilesDeparture1 < = '2012-04-04') OR (ProfilesDeparture2> = '2012-04-01' AND ProfilesDeparture2 < = '2012-04-04') OR (ProfilesDeparture3> = '2012-04-01' AND ProfilesDeparture3 < = '2012-04-04')

4

使用MySQL的BETWEEN運營商:

WHERE 
    `Profiles`.`Departure1` BETWEEN CAST('2012-04-01' AS Date) AND CAST('2012-04-04' AS Date) OR 
    `Profiles`.`Departure2` BETWEEN CAST('2012-04-01' AS Date) AND CAST('2012-04-04' AS Date) OR 
    `Profiles`.`Departure3` BETWEEN CAST('2012-04-01' AS Date) AND CAST('2012-04-04' AS Date) 

參見文檔:

的說明:如果這是東西你要成爲的類型做了很多,考慮將日期存儲爲UNIX時間戳,而使用BIGINT字段類型比Date。這樣你就不必非常使用CAST來比較BETWEEN。您可以使用FROM_UNIXTIMEdocs)來格式化數據庫的出路,而不是在每次比較時進行轉換。請參閱:

+0

你根本不用投。只要做'date_field BETWEEN「2012-01-01」和「2012-01-10」'。另外,由於日期範圍掃描[DATE字段比INT更快](http://www.dbtuna.com/article.php?id=36),所以無需轉換DATE字段以適應時間戳。 一個必須小心DATETIME領域雖然因爲,如果你做這些BETWEEN,它將「排除」最後一個日期,因爲對於「BETWEEN」2000-01-01「和」2000-01-10「'它將在技術上執行BETWEEN「2000-01-01 00:00:00」和「2000-01-10 00:00:00」。因此,請確保您定義了正確的「23:59:59」關門時間。 – Andris 2012-04-03 17:12:16

+0

感謝您的評論!您鏈接到的有關基準的文章看起來並不涉及'INT',而是'TIMESTAMP'和'DATE'。從手冊對'TIMESTAMP'機制的討論中,我並不覺得它比'DATE'慢,但是我會質疑'INT'較慢。就不需要'CAST'而言,我不喜歡隱式轉換,即使它被烘焙了。我總是會使用顯式類型轉換,因爲我認爲它會提供更直接和更具表現力的代碼 - 您知道開發人員是什麼因爲我完全是這樣編碼的。海事組織,越不明確,越好。 – 2012-04-03 17:30:38