【发布时间】:2023-03-07 21:31:01
【问题描述】:
我正在开发一个显示事件列表的应用程序。最初,该应用程序使用 Drupal 并将事件显示为“范围”。因此,如果 3/4、3/6、3/8 有活动,则日期显示为 3/4 - 3/8。
我最近将此应用程序移植到自定义解决方案,因为事件变得更加先进。客户只是要求这种行为令人困惑。他想说 3/4、3/6、3/8 但我们也需要处理连续日期。
因此,如果我们有 3/4、3/6、3/8 和 3/10、3/11、3/12 的事件 - 我们需要查看以下内容 3/4、3/6、3/8、3/10-3/12
目前事件列表有一个主事件表
EventID (int)
Event (varchar)
Active (tinyint)
还有一个事件日期表
EventDateID(int)
EventDate
EventTime
EventID
这是我的 SQL
SELECT *, MIN(tblEventDates.EventDate) AS minDate
FROM tblEvents INNER JOIN tblEventDates
ON tblEvents.EventID = tblEventDates.EventID
WHERE tblEvents.Active = 1
AND tblEventDates.EventDate >= CURDATE()
GROUP BY tblEvents.EventID
ORDER By minDate, EventTime
我正在对这两个表进行内部联接以生成事件列表。在该输出循环中,我再次查询并获取单个 EventDates 并生成范围
SELECT MAX(EventDate) AS maxDate, MIN(EventDate) AS minDate
FROM tblEventDates
WHERE EventID = '$EventID'
我只是不确定确定是否显示范围的这一部分或孤立日期的最佳方法是什么。
有什么建议吗?
【问题讨论】:
-
这在客户端代码中做得更好。 SQL 更适合数据检索,而不是数据格式化。
-
我认为最好的解决方案是在循环中通过 PHP 处理这个问题(参见第二个查询)
-
这可以通过 PHP 使用
DateTime和DateInterval.... 轻松完成。当然,您必须根据它们在数据库中的存储方式来构建不同的日期。我相信默认的 DATETIME 是一个“YYYY-MM-DD”字符串,一个简单的explode应该可以解决问题