2010-08-14 89 views
2

为你们一个难题的位。我可以提出钝的解决方法(下面),但我认为它会向大家展示是否有更优雅的解决方案。请记住,我正在寻找一个仅限PHP或MySql的解决方案。MySQL添加时间到列

表是'蜡烛2'。我有一个带有日期戳的MySQL TEXT列'time'(例如2010.08.13 19:30)。请不要问为什么它是一个文本字段:)。我有第二个TEXT列“时间范围”列出了时间的面额(例如'15m','30m','1h','4h'或'每日')。 'id'是主键。

我想将“时间范围”中的时间量添加到“时间”。例如,如果'time'=='2010.08.13 19:30'和'timeframe'== 15m,那么它会用'2010.08.13 19:45'更新'时间'(注意增加了15个分钟)。

这是我的想法是:

// PHP查询DB:

//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()到将文本值转换为日期时间值,然后使用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;