【问题标题】:How to convert int to minutes in sql for mathematical operation?如何在sql中将int转换为分钟进行数学运算?
【发布时间】:2014-07-06 13:23:31
【问题描述】:

我的表格列中有一个值 1045(假设为上午 10:45),我想将其与另一列相加,例如 1335(假设为下午 13:35)

我知道我不能直接总结它,因为它会给出错误的时间格式输出,例如 2380(假设为 23:80 pm ,没有这样的东西)

所以我把它转换成分钟,然后只做正常的数学运算。

感谢任何帮助

谢谢楼主

【问题讨论】:

  • 上午 10:45 和下午 13:35 相加是什么意思?
  • 嗨 Oli,我想找到总小时数,所以在没有正确格式的情况下直接添加它会导致错误所以我需要将字符串从 1045 转换为 10:45 与 (之间的冒号然后转换它到分钟然后只有我可以总结它)
  • 你能举一个例子,表格的一行,你要执行的计算和结果吗?我知道想要将存储为 1045 的数字转换为时间 10:45 但是当你说你想“将数字 1335 添加到那个时间”时,我不明白你的意思。
  • 添加冒号会使其字符串不是int,所以我建议你从头开始取字符串。我可以提供一些我能想到的有点长但最简单的代码来准确增加你的时间。如果您同意使用字符串,请回复。或者是的,您可以将其转换为 int atlast,但您需要将其转换为字符串

标签: php mysql sql time sum


【解决方案1】:

如果总和(如您的情况)大于 24 小时,您会怎么做?您使用模数(小时部分)还是天部分有意义?

如您所说,将前两个字符转换为整数,乘以 60 并添加到第二对字符的整数转换中。除以 1440 得到天分数。

或者,在第三个位置插入一个 ':' 并使用字符串到时间函数。

【讨论】:

    【解决方案2】:

    你必须考虑一件事:

    假设您想将20 添加到1045;结果将是1065(如果没有一些技巧,它无法转换为适当的时间)而不是1105(这肯定是你想要的)。

    有两种可能的解决方案:

    1. “手动”将事物转换为可以添加的数量。
    2. 使用unix_timestamp()

    第一个解决方案将涉及创建一个函数,将日期转换为整数,将小时转换为分数(微软的风格)......这是一种麻烦且容易出错的方法。

    第二个选项更可靠,因为:

    1. 这是一个 MySQL 内置函数
    2. 它将日期(和时间)转换为具有预定义纪元的数字:任何日期或日期时间在 UNIX-Time 中定义为自 1970-01-01 00:00:00... 以来经过的秒数,无论如何您都可以添加此类数字想要。

    因此,例如,如果您想将 13 小时添加到 `2014-07-06 08:00:00' ,您会得到这样的结果:

    select 
        @d := '2014-08-06 08:00:00',  -- Storing the value in the @d temp variable
        unix_timestamp(@d),  -- Converting @d to UNIX time
        from_unixtime(unix_timestamp(@d) + 13 * (60*60))  -- Adding 13 hours 
                                                          -- (13 * 60 * 60 seconds) to @d 
                                                          -- and converting it back
                                                          -- to DATETIME
    ;
    

    当然,还有更简单的方法。如果您想为日期或时间添加一些间隔,可以使用date_add() 函数:

    select @d := '2014-08-06 08:00:00', date_add(@d, interval +13 hour);
    

    【讨论】:

      【解决方案3】:

      我假设结果应该是 2420:

      您可以通过一系列整数除法和模运算来做到这一点:

      set @a=1045;
      set @b=1335;
      SELECT ((((@a DIV 100) * 60) + @a MOD 100 + ((@b DIV 100) * 60) + @b MOD 100) DIV 60) * 100 +
      

      ((((@a DIV 100) * 60) + @a MOD 100 + ((@b DIV 100) * 60) + @b MOD 100) MOD 60;

      单步说明:

      -- gives us the value of @a interpreted as minutes: 645
      SELECT 'minutes a' as description, ((@a DIV 100) * 60) + @a MOD 100 as a
      
      -- gives us the value of @b interpreted as minutes: 1815
      SELECT 'minutes b', ((@b DIV 100) * 60) + @b MOD 100
      
      -- gives us the sum of those minutes
      SELECT 'a + b', ((@a DIV 100) * 60) + @a MOD 100 + ((@b DIV 100) * 60) + @b MOD 100
      
      -- to convert back to HH:mm
      SELECT 'a + b in HH:mm', ((((@a DIV 100) * 60) + @a MOD 100 + ((@b DIV 100) * 60) + @b MOD 100) DIV 60) * 100 +
      

      ((((@a DIV 100) * 60) + @a MOD 100 + ((@b DIV 100) * 60) + @b MOD 100) MOD 60;

      查看demo

      但如果您使用正确的数据类型(可能是TIME),则不需要这些复杂的计算。

      【讨论】:

        【解决方案4】:

        这是给你的解决方案。

            <?php
            $time='10:45';
            $timenew='13:35';
            $a=substr($time,0,2);
            $b=substr($time,3,2);
            $c=substr($timenew,0,2);
            $d=substr($timenew,3,2);
            $m=$a+$c;
            $s=$b+$d;
            if($s>=60)
            {
             $s=$s-60;
             $m++;
            }
            if($m>=24)
            {
             $m=$m-24;
            }
            $n=$m.":".$s;
            echo "$time <br>";
            echo "$timenew <br>";
            echo "New Time=$n";
            ?>
        

        这给出了精确的结果

        【讨论】:

          【解决方案5】:

          您应该将列转换为时间类型列(请参阅此处的文档 - http://dev.mysql.com/doc/refman/5.6/en/time.html)。

          这将大大简化您将时间值加在一起的事情,因为您可以使用 ADDTIME() 函数来做您想做的事情(请参阅此处的文档 - http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_addtime)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-28
            • 1970-01-01
            • 2014-08-20
            • 1970-01-01
            • 1970-01-01
            • 2013-07-18
            • 2013-05-13
            • 1970-01-01
            相关资源
            最近更新 更多