2011-11-07 59 views
0

我正在製作一個活動頁面,用戶可以在其中創建活動,其關注者可以在其活動頁面上查看活動。選擇今年的日期和月份組

我想要做的是從表中選擇事件日期在今年(2011年)內的所有事件,因此如果日期是2011-03-30它將顯示在March標頭中,但如果它是2012-03-30它會一直顯示到明年。

總的來說,我希望所有事件都顯示在標題下,例如,一月二月三月。

我的表結構是這樣的:

 
id        int(11) 
event_creator_user_id   int(11) 
event_creator_user_username varchar(255) 
event_creator_user_first_name varchar(255) 
event_creator_user_last_name varchar(255) 
event_name      varchar(255) 
event_date      date 
event_time      time 
event_brief_location   varchar(255) 
event_location_street   varchar(255) 
event_location_town   varchar(255) 
event_location_post_code  varchar(255) 
event_description    text 
event_create_date    datetime 
type       enum('a','b') 
+0

我覺得Treffynnon的方法很不錯。你也可以使用DATE_FORMAT(「%m」,event_date)來選擇月份(我認爲MySQL比PHP更快完成 - 而PHP更方便/可讀)。 – AaL

回答

2

我認爲你已經結束了這個問題。這可以通過簡單地使用MySQLs DATE_FORMAT function獲取當年的所有事件並按日期排序來解決。

然後在PHP中,您可以簡單地遍歷它們,並在月份更改時打印出標題。下面的代碼應該更清楚。

在PHP:

$conn = mysql_connect("localhost", "mysql_user", "mysql_password"); 
mysql_select_db("mydbname"); 

$SQL = " 
    SELECT *, 
      UNIX_TIMESTAMP(`event_date`) AS event_date_timestamp 
    FROM events 
    WHERE DATE_FORMAT(event_date, '%Y') = 2011 
     AND event_date > NOW() 
    ORDER BY event_date ASC"; 

$result = mysql_query($SQL); 

$current_month = ''; 
while ($event = mysql_fetch_assoc($result)) { 
    $month = date('m', $event['event_date_timestamp']); 
    if($current_month != $month) { 
     $current_month = $month; 
     echo '<h1>' . $current_month . '</h1>'; 
    } 
    echo '<p>' . $event['event_name'] . '</p>'; 
} 
+0

不想聽起來忘恩負義,但沒有幫助。 – Frank

+1

爲什麼不呢?如果你讓我知道,也許我可以改善你的情況。 – Treffynnon

+0

我是PHP的新手,我對你的整個代碼感到困惑。警告:爲foreach提供的無效參數() – Frank

1

在我的數據庫,我存儲日期爲INT爲UNIX時間戳,秒數自1月1日1970年這樣,如果我要選擇一個範圍(這樣一個公正的三月份),我可以使用mktime

$query = mysql_query("SELECT * FROM `events` WHERE `date` > ".mktime(0,0,0,3,1,2011). " AND `date` < ".mktime(0,0,0,4,1,2011)); 

你可以通過循環幾個月是這樣的:

for($i=1; $i<=12; $i++){ 
    $query = mysql_query("SELECT * FROM `events` WHERE `date` > ".mktime(0,0,0,$i,1,2011). " AND `date` < ".mktime(0,0,0,$i+1,1,2011)); 
    $monthName = date("F",mktime(0,0,0,$i,1,2011)); // full name of the month; use "M" for short-name 
    // ... your code for printing the events here 
} 

我會幫助date數據類型,但我沒有使用它。

+1

您還可以使用'ORDER BY \'date \'ASC'從第一個到最後一個順序獲取事件。 – Tim

2

你可以使用函數的日期的年份部分。假設它是MySQL:

SELECT 
    *, 
    MONTH(event_date) AS 'month' 
FROM events 
WHERE YEAR(event_date) = YEAR(CURDATE()) 
ORDER BY month ASC 
+0

我沒有使用MySQL的日期結構,但看到這樣的代碼後,它讓我想進入它! – Tim

+0

這些都是不錯的捷徑。我選擇了更詳細地演示更多功能,但這樣更容易閱讀! – Treffynnon

+0

只是一個警告:大多數函數,像那些漂亮的日期函數,都是特定於供應商/ DBMS的。糟糕:你的SQL /代碼不可移植。好處:減少網絡/流量開銷(客戶端/服務器繞過參數),尤其是存儲過程/視圖。醜陋的:這些東西取決於服務器設置(你可能沒有控制權)。始終檢查手動和服務器設置。您的服務器可能在不同的時區運行! 關於日期/時間處理的另一個建議:如果您處理ISO格式的日期/時間和UTC時區,它將爲您節省很多麻煩。 – shimofuri

相關問題