【问题标题】:Select where date is in this year and group by month选择今年的日期并按月分组
【发布时间】:2011-11-07 16:25:16
【问题描述】:

我正在开发一个活动页面,用户可以在其中创建活动,并且他们的关注者可以在他们的活动页面上查看活动。

我想做的是从事件日期在今年(2011 年)内的表中选择所有事件,所以如果日期是 2011-03-30,它将显示在三月标题中,但如果它是 @987654322 @它直到明年才会显示。

总的来说,我希望所有事件都显示在标题下,例如一月、二月、三月。

我的表结构是这样的:

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) 事件名称 varchar(255) event_date 日期 event_time 时间 event_brief_location varchar(255) event_location_street varchar(255) event_location_town varchar(255) event_location_post_code varchar(255) 事件描述文本 event_create_date 日期时间 键入枚举('a','b')

【问题讨论】:

  • 我认为Treffynnon 的方法很不错。您还可以使用 DATE_FORMAT("%m", event_date) 选择月份(我认为 MySQL 比 PHP 完成得更快 - 加上 PHP 更方便/可读)。

标签: php sql date


【解决方案1】:

我认为你把问题复杂化了。这可以通过简单地使用 MySQL 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>';
}

【讨论】:

  • 不想听起来忘恩负义,但这并没有帮助。
  • 为什么不呢?如果你让我知道,也许我可以根据你的情况改进它。
  • 我是 PHP 新手,我对你的整个代码感到困惑。警告:为 foreach() 提供的参数无效
  • 我已将代码更新为更完整的 PHP 代码 sn-p。有关 mysql_* 函数的更多信息,请参阅手册:php.net/manual/en/function.mysql-fetch-assoc.php
  • event_date_timestamp 是从哪里来的?
【解决方案2】:

您可以使用函数获取日期的年份部分。假设它是 MySQL:

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

【讨论】:

  • 我没有使用过 MySQL 的日期结构,但是看到这样的代码后,我很想进入它!
  • 这些都是不错的捷径。我选择让它更冗长以演示更多功能,但这更容易阅读!
  • 只是一个警告:大多数函数,比如那些漂亮的日期函数,都是特定于供应商/DBMS 的。坏处:您的 SQL/代码不可移植。好处:更少的网络/流量开销(客户端/服务器传递参数)和快速,尤其是存储过程/视图。丑陋的:这些东西取决于服务器设置(您可能无法控制)。始终检查手册和服务器设置。您的服务器可能在不同的时区运行!关于日期/时间处理的另一个建议:如果您以 ISO 格式和 UTC 时区处理日期/时间,它将为您省去很多麻烦。
【解决方案3】:

在我的数据库中,我将日期存储为 int 作为 unix 时间戳,自 1970 年 1 月 1 日以来的秒数。这样,​​如果我想选择一个范围(例如三月),我可以使用 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 数据类型,但我没有使用它。

【讨论】:

  • 您也可以使用ORDER BY `date` ASC 获取事件从头到尾的顺序。
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 2018-12-24
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多