【问题标题】:MySQL add time to columnMySQL将时间添加到列
【发布时间】:2010-08-14 16:39:43
【问题描述】:

对你们来说有点谜。我可以想出直截了当的解决方法(如下),但我认为它会呈现给大家,看看是否有更优雅的解决方案。请记住,我正在寻找仅 PHP 或 MySql 的解决方案。

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

我想将 'timeframe' 中的时间量添加到 'time' 中。

例如,如果 'time' == '2010.08.13 19:30' 和 'timeframe'==15m 那么它将用 '2010.08.13 19:45' 更新 'time' (注意增加了 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"); 
   }
}

【问题讨论】:

    标签: php mysql unix time


    【解决方案1】:

    为什么不使用 MySQL 的 STR_TO_DATE() 将您的文本值转换为日期时间值,然后使用 DATE_ADD() 添加间隔?将您的时间范围转换为 MySQL 期望的间隔格式应该相当容易(例如INTERVAL 30 MINUTE)。然后您可以使用DATE_FORMAT() 将其恢复为文本形式。

    【讨论】:

      【解决方案2】:

      将您的 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 );
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-25
          • 2018-03-10
          • 1970-01-01
          相关资源
          最近更新 更多