2010-08-14 5 views
2

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

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

Я хочу добавить количество времени в «таймфрейме» на «время».

Так, например, если «время» == '2010.08.13 19:30' и 'timeframe' == 15m, то оно обновит «время» на «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"); 
    } 
} 

ответ

1

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

0

изменить функцию newtime на следующее:

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); 
} 
0

Вы можете использовать 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; 
Смежные вопросы