特定MySQL日期查询情况的最佳实践

时间:2011-06-20 16:27:12

标签: php mysql zend-framework datetime date

我需要根据Zend / MySQL中的几个日期选项实现一个相当复杂的查询,并且很乐意从那些不像我一样陷入我的代码的人那里得到一些建议:)

我有一个表“event_dates”,日期描述与我的应用中的事件模型相关联。每个活动都可以有多个活动日期,而且可能会有相当复杂的设置。

可配置且与此问题相关的内容如下:

  • 修复日期
  • 日期范围(date_from,date_to)
  • 基于“特定工作日”的日期范围
  • 日期范围基于“每第n周”(每第2周,每回合一次)
  • 基于“每月第n个工作日”(第二个星期一)的日期范围
  • 当然还有这些的所有组合。

我正在尝试在编码之前写下查询,因此我清楚地了解了所需要的内容 - 但是有一些组合我无法在没有预先编码可能日期列表的情况下处理

你将如何实现这一点 - 理论上,不要在这里要求特定的代码(还是:))。你会在PHP中创建一个可能的命中列表,然后以一种更简单的方式查询它们,或者你宁愿做一个二十世纪和二十几岁的复杂查询等等吗?

感谢您的时间

  • ·阿尔

PS:这可能会有所帮助 - >

CREATE TABLE `event_dates` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `events_id` int(11) NOT NULL,
  `datetime_from` datetime DEFAULT NULL,
  `datetime_to` datetime DEFAULT NULL,
  `date_from` date DEFAULT NULL,
  `date_to` date DEFAULT NULL,
  `time_from` time DEFAULT NULL,
  `time_to` time DEFAULT NULL,
  `date_type` tinyint(4) NOT NULL DEFAULT '0',
  `frequency_in_weeks` tinyint(4) DEFAULT NULL,
  `nth_wday_in_month_week` tinyint(4) DEFAULT '0',
  `nth_wday_in_month_wday` tinyint(4) NOT NULL DEFAULT '0',
  `is_mondays` tinyint(1) NOT NULL DEFAULT '0',
  `is_tuesdays` tinyint(1) NOT NULL DEFAULT '0',
  `is_wednesdays` tinyint(1) NOT NULL DEFAULT '0',
  `is_thursdays` tinyint(1) NOT NULL DEFAULT '0',
  `is_fridays` tinyint(1) NOT NULL DEFAULT '0',
  `is_saturdays` tinyint(1) NOT NULL DEFAULT '0',
  `is_sundays` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

2 个答案:

答案 0 :(得分:1)

我已经使用日历应用程序走了这条路,最终决定将每个事件实例存储在数据库中。

对于应用程序的这一部分,有两个表...一个用于存储事件信息(标题,描述等),一个用于每个实例(id,开始日期/时间,结束日期/时间)等等。)。

缺点是事件真的必须在未来的某个时刻结束,无论是从现在开始的一个月,还是从现在开始的50年。您可以在将来为“无限重复”事件选择一个任意日期,但这取决于您的应用程序是否合适。

好处很多。您可以快速访问事件的日期/时间,而无需动态计算...它已经在数据库中!它使代码的其余部分变得非常简单。

您选择的路线取决于您,但我发现通过保持简单快速,每个人都非常高兴。

答案 1 :(得分:0)

如何使用Google日历API?谷歌支持所有类型的重复活动,并且在zend框架中已经有一个内置的库。 http://framework.zend.com/manual/en/zend.gdata.calendar.html

我们也尝试过定制的重复活动,并且在它太多了之后放弃了。编辑活动是一个发展的噩梦。我们会尽快切换到此API。