2010-12-18 35 views
0

我有一個記錄,這樣設置包含UNIX時間戳記錄日期:如果在本月發生unix時間戳範圍,MySQL查詢將返回行嗎?

+----+-----------+-----------+---------+ 
|Id |Start Date |EndDate |MoreData | 
+----+-----------+-----------+---------+ 
|1 |1292692439 |2147483647 |...  | 
+----+-----------+-----------+---------+ 
|2 |1272776400 |1274331600 |...  | 
+----+-----------+-----------+---------+ 
|3 |1293256800 |2147483647 |...  | 
+----+-----------+-----------+---------+ 
|4 |1294552800 |2147483647 |...  | 
+----+-----------+-----------+---------+ 

什麼,我需要做的是寫一個MySQL查詢(使用PHP),只有返回包含開始日期的行即在本月或之前 enddate在本月或之後。

例如,在上述記錄集中,如果查詢本月(2010年12月),不應返回id 2和4的行,因爲2的enddate是2010年5月,4的startdate是2011年1月。

有關查詢的外觀如何的幫助非常感謝,或者在編寫此查詢時使用MySQL查詢命令可能有用的任何想法?

+0

是否有你存儲Unix時間戳而不是使用DATETIME數據類型的原因? – AgentConundrum 2010-12-18 16:30:36

+0

@AgentConundrum現在有一個關於在reddit上的確切討論:http://www.reddit.com/r/programming/comments/envkn/working_with_dates_in_sql_what_to_avoid_how_to_do/c19j8ly – 2010-12-18 16:32:17

+1

你在找這樣的東西:SELECT * FROM thetable WHERE StartDate> ='2010-12-12'; – SuperSaiyan 2010-12-18 16:33:15

回答

-1

我實際使用這種格式來測試日期:

FROM_UNIXTIME(start) <= '2010-12-12' ...etc. 

這是最簡單,最容易實現。 Thrustmaster在評論中提出了這個建議。

0

這應該做的伎倆:

SELECT * FROM table WHERE MONTH(FROM_UNIXTIME(start)) <= 12 AND MONTH(FROM_UNIXTIME(end)) >= 12 AND YEAR(FROM_UNIXTIME(start)) <= 2010 AND YEAR(FROM_UNIXTIME(end)) >= 2010 
+0

不錯,簡單。 – 2010-12-18 16:42:18

+0

@加里這是醜陋而複雜的 – 2010-12-18 16:44:16

+0

你有更好的主意嗎? – 2010-12-18 18:40:40

0

,因爲你需要開始從PHP查詢時,明智的做法是計算在PHP中給定月份的第一天和最後一天的時間戳,喂這些值作爲你的MySQL查詢的參數。你需要像這樣:

function get_records_for_date($datestr) { 
    $results = array(); 
    $ts = time(); 
    if ($datestr) { 
     $ts = strtotime($datestr); 
    } 
    $first_day = mktime(0, 0, 1, date('n', $ts), 1, date('Y', $ts)); 
    $last_day = mktime(23, 59, 59, date('n', $ts), date('t', $ts), date('Y', $ts)); 
    $query = "SELECT * FROM yourtable WHERE start_date <= {$last_day} AND end_date >= {$first_day}"; 
    $query_result = mysql_query($query); 
    while ($row = mysql_fetch_assoc($query_result)) { 
     $results[] = $row; 
    } 
    return $results; 
} 

然後你就可以調用這個函數沒有參數來獲取所有記錄當月,或者您也可以通過任何日期字符串 - 可以通過的strtotime解析() - 獲取特定月份的記錄。

get_records_for_date(); 
get_records_for_date('2009-09-12'); 
get_records_for_date('April 5, 2005'); 
+0

整個月檢查,而不是一天? – 2010-12-19 03:46:26

+0

@Col。 Shrapnel:那麼可以重寫這個函數來接受兩個參數,年份和月份,並在mktime參數列表中的適當位置使用這些參數。或者你離開這個功能,並且假設你有年份和月份,你將它們連接起來並在最後加上一個「-01」。相同的結果,相同的原則:在PHP中計算一次時間戳,將它們傳遞給MySQL。 – 2010-12-19 10:06:51

+0

不是年月,而是兩個日期 – 2010-12-19 10:09:28