2013-11-15 46 views
1

我目前在MySQL版本4.0.8數據庫(MyISAM引擎)INT(10)列中存儲日期作爲Unix時間戳。MySQL之間的問題不與Unix時間戳工作

我查詢這些日期使用下面的SQL提取日期範圍之間記錄:

$sql = "SELECT `users`.`real_name`, `users`.`user_value`, `clients`.`client_name`, `clients`.`client_stars`, `timing`.`start_date`, `timing`.`end_date`, `projects`.`project_name` 
    from timing 
    LEFT JOIN users on (users.id = timing.user_id) 
    LEFT JOIN clients on (clients.id = timing.client_id) 
    LEFT JOIN projects on (projects.project_id = timing.project_id) 
    WHERE start_date BETWEEN :start_date AND :end_date"; 

我使用的PDO,因此PARAMS。

我100%確定:start_date和:end_date vars在所有情況下都是正確的,因爲我檢查了這些。此外,start_date並不含糊,並且沒有關於此查詢的警告/通知。

我的問題是,我沒有得到預期的行。如果我詢問2013/11/14午夜和2013/11/15午夜之間的行數,預計結果只會從第14位開始。但是,從15日開始的行也通過了 - 但不是全部。

我也剛剛在1384473600和1384473600之間測試 - 這是在今天午夜到今天午夜之間(如同一時間戳)。

返回的行應該爲0,但它已經返回了今天的所有行(例如返回的第一行的start_date值爲1384524193)!

我錯過了關於運算符在mySQL中的工作原理嗎?當最小值和最大值相同時,它如何返回行?

我已經過測試和測試,並且幾乎每次查詢時,都會返回高於指定天花板之間的行數。

什麼問題?

+0

你有沒有嘗試過:WHERE start_date> =:start_date AND start_data <=:end_date'? – Latheesan

+0

所以只是回聲$ sql – Strawberry

回答

0

BETWEEN是一種非常糟糕的匹配日期和時間戳的方法,因爲它包含範圍的兩端。

這可能會爲你工作

WHERE start_date >= :start_date 
     AND start_date < :end_date + 86400 

神奇的數字86400更好地爲以秒爲單位,每天的數量。這將選擇包含start_date參數的午夜之間的所有start_date值,然後排除在:結束日期之後一天的午夜或之後的所有值。如果您使用的是實際時間戳,則可以使用+ INTERVAL 1 DAY而不是+ 86400

+0

我試過使用這種方法,並bizarely我仍然得到完全相同的結果!本月14日午夜,我剛剛嘗試了86400秒的範圍,我仍然得到了返回的第14位的結果。 我發送的start_date是138430080,結束日期是1384387200,其中一個返回的行是1384525509 - 很明顯不是<= 1384387200。 –

0

儘管我不知道爲什麼,當我將它的邏輯完全顛倒過來時。

WHERE timing.start_date < :end_date 
AND timing.start_date >= :start_date 

但是這並沒有奏效,並且返回了相同的錯誤結果。

WHERE start_date >= :start_date 
AND start_date < :end_date 

任何人都可以解釋爲什麼嗎?

+0

確保start_date和end_date具有相同的時間格式! – K3rnel31