我需要在Zend/MySQL中实现一个基于几个日期选项的相当复杂的查询,并很高兴从那些不像我那样拘泥于代码的人那里得到一些建议:)
我有一个表"event_dates",其中包含与我的应用程序中的事件模型相关的日期描述。每个事件都可以有多个事件日期,这些日期的设置可能相当复杂。
与此问题相关的可配置内容如下:
- 固定日期
- 日期范围(Date_from,Date_to)
- 基于"特定工作日"的日期范围
- 基于"每n周"的日期范围(每2周,每轮留出一个)
- 日期范围基于"一个月中的第n个工作日"(第二个星期一)
- 当然还有这些的每一个组合
我试图在编码之前写下查询,所以我对需要什么有一个清晰的看法——但如果不预先编码一个可能的日期列表,我就无法处理一些组合。
你将如何实现这一点——理论上,不需要在这里要求特定的代码(还:))。你会用PHP创建一个可能的点击列表,然后用一种更简单的方式查询它们吗?还是更愿意做一个20个where和ands的复杂查询,等等?
感谢您抽出时间
- Arne
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;
我使用了一个日历应用程序,最终决定将事件的每个实例存储在数据库中。
对于应用程序的这一部分,有两个表。。。一个用于存储事件信息(标题、描述等),另一个用于事件的每个实例(id、开始日期/时间、结束日期/时间等)。
不利的一面是,事件确实必须在未来的某个时刻结束,无论是一个月后,还是50年后。您可以在未来为"无限重复"的事件选择一个任意的日期,但这取决于您的应用程序是否合适。
好处很多。您可以快速访问事件的日期/时间,而无需实时计算。。。它已经在数据库中了!它使代码的其余部分变得非常简单。
你选择的路线由你决定,但我发现,通过保持简单快捷,每个人都很满意。
使用google日历API怎么样?谷歌支持所有类型的重复事件,zend框架中已经有一个内置库。http://framework.zend.com/manual/en/zend.gdata.calendar.html
我们也尝试过做一个定制的重复事件,但由于太bug,我们放弃了。编辑事件是一场噩梦。我们将尽快切换到此API。