5

我有 2 个约会

开始日期时间 = 2013-08-28 17:43:41AND 结束日期时间 =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
......同样地

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

4

3 回答 3

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);
于 2013-08-27T05:26:19.310 回答
2

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

  1. 创建函数 ToUpper15 (dateParam DATETIME)
  2. 创建函数 ToLower15 (dateParam DATETIME)
  3. CREATE PROCEDURE AddIntervalMinutes (startdate DATETIME, enddate DATETIME,interval INT)

这是一些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 
于 2014-02-01T19:17:59.967 回答
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
}
于 2014-02-01T08:54:36.810 回答