0

我正在开发一个显示事件的 PHP 应用程序。它会生成一个选择框,允许访问者选择应显示事件的月份。

我的问题与选择框有关,它不仅应显示事件开始或结束的月份,还应显示事件仍在发生的月份(即使它在几个月前开始并在几个月后结束)。

这是我目前所拥有的,它非常基本,只返回事件开始的月份。

SELECT 
  DISTINCT DATE_FORMAT(start,'%M %Y') as prettydate, 
  DATE_FORMAT(start,'%m%Y') as monthyear 
FROM 
  `events` 
WHERE 
  start >= NOW() 
ORDER BY 
  start ASC;

例如,如果我在 2014 年获得的唯一事件在 2 月开始并在 7 月结束,我如何才能同时获得 2 月和 7 月以及 2014 年 3 月、4 月、5 月和 6 月的结果?

在此先感谢您的帮助!

4

2 回答 2

2

假设您没有任何超过 1 年的事件,并使用以下开始/结束日期:

('2012-01-01','2012-01-31'),
('2012-03-01','2012-03-31'),
('2012-05-01','2012-06-01'),
('2012-07-01','2012-07-31'),
('2012-09-01','2012-10-31'),
('2012-11-01','2012-11-30');

这个查询:

SELECT DISTINCT
  DISTINCT DATE_FORMAT(e.start + INTERVAL ids.id MONTH,'%M %Y') as prettydate, 
  DATE_FORMAT(e.start + INTERVAL ids.id MONTH,'%m%Y') as monthyear 
FROM 
(
  SELECT 0 AS id
  UNION SELECT 1
  UNION SELECT 2
  UNION SELECT 3
  UNION SELECT 4
  UNION SELECT 5
  UNION SELECT 6
  UNION SELECT 7
  UNION SELECT 8
  UNION SELECT 9
  UNION SELECT 10
  UNION SELECT 11
) ids,
  events e
WHERE
  EXTRACT(YEAR_MONTH FROM e.start + INTERVAL ids.id MONTH) <=
  EXTRACT(YEAR_MONTH FROM e.end)
ORDER BY 
  e.start + INTERVAL ids.id MONTH

将返回:

prettydate      monthyear
January 2012    012012
March 2012      032012
May 2012        052012
June 2012       062012
July 2012       072012
September 2012  092012
October 2012    102012
November 2012   112012

有关工作示例,请参阅http://sqlfiddle.com/#!2/12b08/3 。

于 2012-10-11T17:01:37.343 回答
0

选择每个事件的开始和结束日期。完成日期后,您可以计算事件开始和结束之间的月份。

尝试使用http://php.net/manual/en/function.date.php

使用该格式或您自己的格式,您可以检查开始日期月份和年份是否与结束月份和年份相同。如果不是,只需填写列表,比如说一些预定义的月份数组。

$months = array(1 => "Jan", 2 => "Feb", ... , 12 => "Dec");

然后你可以做一些事情,从那里你可以计算中间的月数,然后简单地遍历 $months 数组。

于 2012-10-11T16:33:37.623 回答