选择今年的日期和月份组

问题描述:

我正在制作一个活动页面,用户可以在其中创建活动,其关注者可以在其活动页面上查看活动。选择今年的日期和月份组

我想要做的是从表中选择事件日期在今年(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

我认为你已经结束了这个问题。这可以通过简单地使用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

在我的数据库,我存储日期为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

你可以使用函数的日期的年份部分。假设它是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