MYSQL - 查询与日期匹配的项目

时间:2009-12-11 15:55:53

标签: php mysql

我正在用PHP创建一个日历,并且我有一个for循环31天(或取决于当月的天数),每天都用$ listDay写出来。

在我的MySQL数据库中,我有一个名为'eventDate'的字段,带有一个unix时间戳,我有一个变量$ event_day,它是从当天的时间戳开始构建的。我无法弄清楚如何写一个查询“如果$ listDay == $ event_day然后显示这个”。这段代码可能有点乱,因为我一直在玩一堆选项。

这应该做的是,如果当天有一个事件,用一个链接替换标准号码,如果moused将显示该事件的一个小弹出窗口(在js中处理,我确实有弹出窗口正常工作)

我知道MySQL语句的方式有问题,但我无法弄明白。哦是的,我在数据库中创建了一个名为'eventMonth'的字段,因为我无法想象如何使查询'匹配'一个月与时间戳。

$month = date("F");
$vmonth = date("n");
$current_month = date("n"); //value will change if the user changes the month they are viewing
$current_year = date('Y');
$theday = date(w, mktime(0, 0, 0, $current_month, 1, $current_year));
$daysinmonth = date("t", mktime(0, 0, 0, $current_month, 1, $current_year));

echo "<table bgcolor=\"#C68282\" style=\"border: #990000 1px solid; font-size:8pt; font-family: Tahoma; color: #000000\" cellpadding=\"1\" cellspacing=\"0\" width=\"129\">";
echo "<tr>
<td colspan=7 align=center style=\"font-weight: bold;\">".date('F Y', mktime(0, 0, 0, $current_month, 1, $current_year))."</td>
</tr>";
echo "<tr style=\"background-color: 990000; color: white;\">";
echo "<td align=center>S</td>";
echo "<td align=center>M</td>";
echo "<td align=center>T</td>";
echo "<td align=center>W</td>";
echo "<td align=center>T</td>";
echo "<td align=center>F</td>";
echo "<td align=center>S</td>";
echo "</tr>";
echo "<tr>";
for ($i=0;$i<$theday;$i++)
{
   echo "<td>&nbsp;</td>";
}
$query = "SELECT * FROM calendar WHERE eventMonth = '77'"; 
$result = mysql_query($query); 
$row = mysql_fetch_array($result);
for ($list_day=1;$list_day<=$daysinmonth;$list_day++)
{
    $event_day = date('j',$row['eventDate']);
  echo "<td align=\"center\">";
  if($list_day == $event_day) { 
    echo "<a href=\"#\" class=\"cal\">";
        echo $list_day . "<span class\"cal\"><div style=\"border-bottom: 1px solid #999999; padding: 2px; \">" . $month ."&nbsp;". $list_day .",&nbsp;". $current_year ." </div><div style=\"padding: 2px;\">" . $row['event'] ."</div></span></a></td>";
    } else { 
        echo $list_day;
    }
  if ($theday == 6)
  {
    echo "</tr>";
    echo "<tr>";
    $theday = -1;
  }
  $theday++;
}
echo "</tr>";
echo "</table>";

2 个答案:

答案 0 :(得分:2)

使用MySQL的DATE_FORMAT

SELECT * FROM calendar WHERE DATE_FORMAT(timestamp, '%Y-%m-%d') = '2009-12-11';

但如果您每天都在查询数据库,那么您正在执行30个不需要的查询。在一个查询中提前获取所有事件然后从这些事件构建数组会更明智,如下所示:

// Get all events for December 2009
$q = mysql_query("SELECT
                    DATE_FORMAT(timestamp, '%d') AS day,
                    event_title
                FROM
                    calendar
                WHERE
                    DATE_FORMAT(timestamp, '%Y-%m') = '2009-12'");

$events = array();
// Loop through the results and put events in array
while($row = mysql_fetch_array($q)) {
    $events[$row['day']][] = $row['event_title'];
}

现在$events包含按当天编制索引的月份的每个事件,当您打印日历时,您可以使用以下方式获取当天的事件数量:

for($d = 1; $d <= 31; $d++) {
    if(isset($events[$d])) {
        echo count($events[$d])." events!";
    } else {
        echo "No events.";
    }
}

答案 1 :(得分:2)

只需使用字符串 - mysql将其转换

select * from test_time_table where the_time = '2009-12-09';

获取日期活动

select * from test_time_table where the_time between '2009-12-09 00:00:00' and '2009-12-09 23:59:59';

说真的 - 不要使用DATE_FORMAT。它不仅会使mysql执行不必要的步骤,还会阻止查询进入查询缓存。

编辑 - 您将字段存储为TIMESTAMP,对吗?