Php MySQL向列添加时间
对你们来说有点困惑。我可以想出直截了当的解决方法(如下),但我认为它会向大家展示,看看是否有更优雅的解决方案。请记住,我正在寻找一个PHP或MySql的唯一解决方案 桌子是“烛台2”。我有一个MySQL文本列“time”,里面有一个日期戳(例如2010.08.13 19:30)。请不要问为什么它是一个文本字段:)。我还有第二个文本栏“timeframe”,列出了时间的名称(例如“15m”、“30m”、“1h”、“4h”或“daily”)id'是主键 我想将“timeframe”中的时间量添加到“time”中 因此,例如,如果'time'='2010.08.13 19:30'和'timeframe'==15m,那么它将用'2010.08.13 19:45'更新'time'(注意增加了15分钟) 以下是我的想法: //PHP查询数据库:Php MySQL向列添加时间,php,mysql,unix,time,Php,Mysql,Unix,Time,对你们来说有点困惑。我可以想出直截了当的解决方法(如下),但我认为它会向大家展示,看看是否有更优雅的解决方案。请记住,我正在寻找一个PHP或MySql的唯一解决方案 桌子是“烛台2”。我有一个MySQL文本列“time”,里面有一个日期戳(例如2010.08.13 19:30)。请不要问为什么它是一个文本字段:)。我还有第二个文本栏“timeframe”,列出了时间的名称(例如“15m”、“30m”、“1h”、“4h”或“daily”)id'是主键 我想将“timeframe”中的时间量添加到“
//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");
}
}
为什么不使用MySQL将文本值转换为日期时间值,然后使用添加间隔?将您的时间框架转换为MySQL期望的间隔格式应该相当容易(例如,
interval 30分钟)。然后可以使用将其恢复为文本形式。将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 );
}
您可以使用使日期和时间计算更加简单:
$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;