2010-08-14 53 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;