事件计划php MySQL跟踪即将发生的事件

时间:2015-10-31 03:55:36

标签: php mysql

我一直致力于使用php和MySQL制作活动时间表,我的目标是能够为每个活动改变网站的背景,例如万圣节圣诞节等等我想出了一个可以与月份合作的活动但我需要它来锻炼一天忽略这一年

<?php 
$con = mysql_connect(MYSQL_host,MYSQL_username,MYSQL_password);
mysql_select_db(MYSQL_Database, $con);    

$result = mysql_query('SELECT * FROM Event_Schedule WHERE MONTH(Start) <= MONTH(NOW())  AND MONTH(End) >= MONTH(NOW())') or die('Query failed: ' . mysql_error());

$Edit_theme_row = mysql_fetch_array($result)
?>

我尝试将Day添加到代码中     

$result = mysql_query('SELECT * FROM Event_Schedule WHERE (MONTH(Start) <= MONTH(NOW()) AND DAY(Start) <= DAY(NOW()))  AND (MONTH(End) >= MONTH(NOW()) AND DAY(End) >= DAY(NOW()))') or die('Query failed: ' . mysql_error());

$Edit_theme_row = mysql_fetch_array($result)
?>

但似乎忽略了事件 在MySQL中使用模板DATE 例 2015-10-28至2015-11-02万圣节 2015-12-01至2015-12-26圣诞节 无视这一年,所以每年都会在那个月和一天发生变化

1 个答案:

答案 0 :(得分:1)

我希望我能正确理解你的问题。我看到的第一件事是你在数据库字段的 WHERE 中使用函数。这不是一个好主意。所以MySQL必须读取每条记录(FULL TABLE SCAN)才能做到这一点,并且不能使用索引。

第二件事是你没有在两个单独的字段中规范化每个事件的开始和结束日期,以便进行简单的比较。您可以将应用程序中的日期存储在具有标准化年份的第二个字段中,即。 &#39; 1970&#39;因此您可以轻松地比较它,或者您使用MySQL中的 PERSISTENT 字段,然后MySQL可以为您完成。

这是一个示例

CREATE TABLE `table1` (
  `nr` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `event_name` varchar(32) DEFAULT NULL,
  `event_start` date NOT NULL DEFAULT '0000-00-00',
  `event_end` date NOT NULL DEFAULT '0000-00-00',
  `norm_start` date AS ( date_format(event_start,'1970-%m-%d') ) PERSISTENT,
  `norm_end` date AS ( date_format(event_end,'1970-%m-%d') ) PERSISTENT,
  PRIMARY KEY (`nr`),
  KEY `event_start` (`event_start`,`event_end`),
  KEY `norm_start` (`norm_start`,`norm_end`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

现在我们插入一行

INSERT INTO `table1` 
    ( `event_name`, `event_start`, `event_end`)
VALUES
    ('hallo', '2015-10-31', '2015-10-31');

研究

MariaDB > select * from table1;
+----+------------+-------------+------------+------------+------------+
| nr | event_name | event_start | event_end  | norm_start | norm_end   |
+----+------------+-------------+------------+------------+------------+
|  4 | hallo      | 2015-10-31  | 2015-10-31 | 1970-10-31 | 1970-10-31 |
+----+------------+-------------+------------+------------+------------+
1 row in set (0.00 sec)

现在您可以直接比较日期

SELECT * 
FROM table1 
WHERE date_format(now(),'1970-%m-%d') 
BETWEEN norm_start AND norm_end;

所以你可以举办活动。唯一的事情是当一个事件重叠一年(2015-12-30 - 2016-01-07)时,你会在事件表中放置2行。

如果这场战争你想要什么,请现在就告诉我