MySQL добавить время в столбце - PullRequest
2 голосов
/ 14 августа 2010

Немного загадки для вас, ребята.Я могу придумать тупой обходной путь (ниже), но я подумал, что он представит его всем вам, чтобы увидеть, есть ли более элегантное решение.Имейте в виду, что я ищу решение только для PHP или MySql.

Таблицы - это 'lights2'.У меня есть MySQL TEXT столбец «время», в котором есть метка даты (например, 2010.08.13 19:30).Пожалуйста, не спрашивайте, почему это текстовое поле :).У меня есть второй столбец TEXT «таймфрейм», в котором указывается номинал времени (например, «15 м», «30 м», «1 ч», «4 ч» или «ежедневно»).'id' является первичным ключом.

Я хочу добавить количество времени в 'timeframe' к 'time'.

Так, например, если 'time' == '2010.08.1319:30 'и' timeframe '== 15m, тогда будет обновлено' time 'на' 2010.08.13 19:45 '(обратите внимание на добавление 15 минут).

Вот что я думал:

// PHP, запрашивающий БД:

//using UNIX_TIMESTAMP to make the datetime usable by PHP
$sql = "SELECT UNIX_TIMESTAMP(time), timeframe, id FROM candles2";
$result = mysql_query($sql);

//loop through rows
while($row = mysql_fetch_array($result))
{
 //call function to determine the appropriate # of seconds to add
 $newTime = newTime($row['time'],$row['timeframe']);

 //build UPDATE query and update row
 $update_query = "UPDATE candles2 SET 'time'= FROM_UNIXTIME(" . $newTime . ") WHERE id='".$row['id']."'";
 $update_result = mysql_query($update_query);
}

// Функция PHP для добавления соответствующих секунд

function newTime($oldtime,$timeframe)
{
 switch ($timeframe)
  {
        case "15m":  return($oldtime + 15 * 60);
 case "30m":  return($oldtime + 30 * 60);
        case "1h":  return($oldtime + 60 * 60);
 case "4h":  return($oldtime + 240 * 60);
 case "daily":         return($oldtime + 1440 * 60);
 default:         die("whoops, something broke"); 
   }
}

Ответы [ 3 ]

1 голос
/ 14 августа 2010

Почему бы не использовать MySQL STR_TO_DATE() для преобразования вашего текстового значения в значение даты и времени, а затем использовать DATE_ADD() для добавления интервала?Должно быть довольно легко преобразовать ваш таймфрейм в формат интервала, который ожидает MySQL (например, INTERVAL 30 MINUTE).Затем вы можете использовать DATE_FORMAT(), чтобы вернуть его в текстовую форму.

0 голосов
/ 14 августа 2010

Вы можете использовать PHP DateTime class , чтобы значительно упростить вычисления даты и времени:

$timeframe = '15m';
$time = '2010.08.13 19:30';

$dt = DateTime::createFromFormat('Y.m.d G:i', $time);
$new_dt = $dt->add(
  new DateInterval('PT' . strtoupper(
    str_replace('daily', '24h', $timeframe))));

echo date_format($new_dt, 'Y.m.d G:i');
// 2010.08.13 19:45

Или, для чисто MySQL решения, вы можете использовать курсор для созданияподготовленный оператор для обновления строк:

DELIMITER //
DROP PROCEDURE IF EXISTS update_candles//
CREATE PROCEDURE update_candles()
BEGIN
  DECLARE var_id INT;
  DECLARE var_time, var_timeframe TEXT;

  DECLARE var_done INT DEFAULT 0;
  DECLARE csr_candles CURSOR FOR
    SELECT id, time, timeframe FROM candles2;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET var_done = 1;

  OPEN csr_candles;

  REPEAT
    FETCH csr_candles INTO var_id, var_time, var_timeframe;
    IF NOT var_done THEN
      SET
        @id        := var_id,
        @time      := var_time,
        @timeframe := var_timeframe,
        @unit1     := SUBSTR(@timeframe, -1),
        @unit2     := MAKE_SET(FIND_IN_SET(@unit1, 'm,h,,y'), 'MINUTE', 'HOUR', 'DAY'),
        @interval  := FORMAT(@timeframe, 0) | 1,
        @var_sql   := CONCAT('UPDATE candles2 SET time = TIMESTAMPADD(', @unit2, ',?,?) WHERE id = ?');

      PREPARE sql_stmt FROM @var_sql;
      EXECUTE sql_stmt USING @interval, @time, @id;
    END IF;
  UNTIL var_done END REPEAT;

  DEALLOCATE PREPARE sql_stmt;
END;
//
DELIMITER ;

CALL update_candles;
0 голосов
/ 14 августа 2010

измените вашу новую функцию на следующее:

function newTime($oldtime,$timeframe)
{
  $new_time = strtotime( $oldtime );

  switch ($timeframe)
  {
    case "15m":
      $new_time = $new_time + 15 * 60;
      break;

    case "30m":
      $new_time = $new_time + 30 * 60;
      break;

    case "1h":
      $new_time = $new_time + 60 * 60;
      break;

    case "4h":
      $new_time = $new_time + 240 * 60;
      break;

    case "daily":
      $new_time = $new_time + 1440 * 60;
      break;
  }

  return date( 'Y.m.d H:i', $new_time );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...