使用mysql在15分钟的插槽中分割时间间隔

时间:2013-08-27 04:48:55

标签: php mysql sql datetime group-by

我有2个日期

start datetime = 2013-08-28 17:43:41 AND end datetime = 2013-08-28 22:23:51

现在我希望在这种情况下将开始时间转换为上限15分钟间隔,如2013-08-28 17:45:00,同样的方式转换为较低等级15分钟间隔的结束时间,如2013-08-28 22:15:00

然后我想要那个时间间隔15分钟的数组间隔。

例如。对于我们的情况应该是

a[0] = 2013-08-28 17:45:00
a[0] = 2013-08-28 18:00:00
a[1] = 2013-08-28 18:15:00
a[2] = 2013-08-28 18:30:00
a[3] = 2013-08-28 18:45:00
a[4] = 2013-08-28 19:00:00
......like wise

我想使用mySql / php,但mysql是优先级,因为数据来自我的数据库。

3 个答案:

答案 0 :(得分:9)

如果您有开始时间和结束时间,请将它们转换为UNIX时间戳。之后,只需创建一个循环,将开始时间增加15分钟并继续运行直至到达结束时间。

这样的事情:

$array_of_time = array ();
$start_time    = strtotime ("2013-08-28 17:45:00");
$end_time      = strtotime ("2013-08-28 22:15:00");

$fifteen_mins  = 15 * 60;

while ($start_time <= $end_time)
{
   $array_of_time[] = date ("Y-m-d H:i:s", $start_time);
   $start_time += $fifteen_mins;
}

print_r ($array_of_time);

答案 1 :(得分:2)

我通过PHP和查询解决了这个问题,从数据库中检索开始和结束日期时间。

$start_datetime = strtotime($start_datetime); //from 2013-08-28 17:43:41 to timestamp
$end_datetime = strtotime("+$duration minutes", $start_datetime); //from 2013-08-28 17:43:41 to timestamp

//loop till start time is less than end time
while ($start_datetime < $end_datetime)
{
     //add date as a key in first level array
     if(!array_key_exists(date('Y-m-d', $start_datetime), $booking_slot)) {
          $booking_slot[date('Y-m-d', $start_datetime)]=array();
     }

     //add time slot for perticular date's array
     array_push($booking_slot[date('Y-m-d', $start_datetime)], date("h:i A", $start_datetime));

     //add $interval to find next interval
     $start_datetime = strtotime("+$interval minutes", $start_datetime); //slot or interval
}

答案 2 :(得分:2)

您可以使用以下签名创建自定义MySQL函数和过程。

  1. 创建功能ToUpper15 (dateParam DATETIME)
  2. 创建功能ToLower15 (dateParam DATETIME)
  3. 创建程序AddIntervalMinutes (startdate DATETIME,enddate DATETIME,interval INT)
  4. 以下是一些 MySQL代码的示例,我从来没有编写MySQL,我试图查找文档而且它很糟糕,否则这真是一个30分钟的任务,如果你能找到的话语言语法的文档。

    请记住

    • 当你整理45分钟以上时,你正在四舍五入到下一个小时
    • 对ToLower15执行相同操作
    • 使用系统函数AddTime()执行15分钟间隔

    以下是如何执行此操作

    CREATE FUNCTION ToUpper15(dateParam DATETIME) 
    RETURNS DATETIME
    DETERMINISTIC
    BEGIN
       DECLARE dateYear   INT;
       DECLARE dateMonth  INT;
       DECLARE dateDay    INT;
       DECLARE dateHour   INT;
       DECLARE dateMinute INT;
    
       SET dateYear   = YEAR(dateParam);
       SET dateMonth  = MONTH(dateParam);
       SET dateDay    = DAY(dateParam);
       SET dateHour   = HOUR(dateParam);
       SET dateMinute = MINUTE(dateParam);
    
       IF (dateMinute >= 0 AND dateMinute < 15) THEN
          SET dateMinute = 15;
       ELSEIF (dateMinute >= 15  AND dateMinute < 30) THEN
          SET dateMinute = 30;
       ELSEIF (dateMinute >= 30  AND dateMinute < 45) THEN
          SET dateMinute = 45;
       ELSEIF (dateMinute >= 45  AND dateMinute < 60) THEN
          BEGIN
             SET dateMinute = 0;
             SET dateHour = dateHour + 1;
          END
       END IF;
    
       RETURN CONCAT(dateYear, '-', dateMonth, '-', dateDay, ' ', dateHour, ':', 'dateMinute');
    END