Laravel RAW 查询添加多列浮点值
Posted
技术标签:
【中文标题】Laravel RAW 查询添加多列浮点值【英文标题】:Laravel RAW query to add multiple columns float value 【发布时间】:2018-02-26 16:32:06 【问题描述】:我正在将值存储到数据库中,例如 9:30 和 1(我的数据类型是此列的数据库中的浮点数),当我检索时我无法添加两个数字,它打印的就像 10 但它必须是在 10:30 ,我正在使用 laravel 添加这两列
$get=DB::table('table_name')->select(DB::raw('sum(hours) AS hours'))
->get();
谁能解决我的问题??
【问题讨论】:
首先要做的是实际维护某种格式,如果9:30
存在,则 1 必须至少为 1:00
以便您维护 hh:mm
格式。然后使用DATEDIFF(T1, '00:00')
和SUM
他们
是的,它就像 9:30 和 1:00 一样,我如何总结我的数据类型是 varchar
9:30
不是有效的浮点值(是吗?)您尝试将9:30
放入浮点列并最终在其中有一个9.0
是的,是的,我存储的是 9.30 和 1.00
如果是这种情况,那么数据库应该返回10.3
作为结果(您可以通过对其进行原始查询来验证)。您可能会不小心在代码下方的某个位置对其进行修剪或舍入。
【参考方案1】:
float 用于带有逗号 ,
的数字。你想用:
节省时钟时间。
因此,您可以在将时间存储到数据库之前将其转换为浮点数,10:30 -> 10.5
,然后像这样总结起来
$get=DB::table('table_name')->select(DB::raw('sum(hours) AS hours'))
->first();
$hours = str_replace('.', ':', $get->hours);
这个解决方案不是野兽,因为有更好的方法来处理日期,将它们保存为日期对象而不是浮点对象。
另一种方法是使用smalldatetime
而不是float 来保存值。然后你可以节省时间而不是数字。
【讨论】:
小数点分隔符可以是,
或.
,具体取决于语言环境(我认为欧洲更喜欢,
,美国更喜欢.
)关键是没有人使用:
作为小数分隔符。
table('table')->select(DB::raw('sum(hours) AS hours')) 能否请您更改此查询以添加? :(
更新了我的答案。如果您将它们存储为9.3
,这应该可以工作
请打印使用您的小时表,以便我们查看您的输入类型
我的输入是一列中的 9.30,另一列是 1.00,它正在添加和打印 10.30 中的数字,需要它像 10:30...【参考方案2】:
最好的办法是将数据类型从浮点数更改为整数。通常在大多数编程和数据库级别,浮点值是有问题的,也可能导致精度问题/问题。
所以我的建议是:
以分钟为单位存储时间(或基于您的情况的最小单位) 检索它,然后将其除以 60,然后您就获得了正确的值,而无需使用 hacky 和不稳定的方法来解决它。我希望这是有用的。
【讨论】:
是的,我认为这是一个简单的方法,谢谢 很高兴它很有用。请注意,将分钟除以 60 后,您将获得一个正常的浮点值,例如9.50 相当于 9 小时 30 分钟。我希望你明白我的意思所以你不要担心,你可以使用 php datetime 或 Carbon 来格式化你想要的输出。【参考方案3】:您可以在从 db 检索数据后这样做
$n1 = '9:30';
$timestamp = strtotime($n1);
echo date('H:i',strtotime('+1 hour',$timestamp));
【讨论】:
检索后不像 9:30 像 9.30 您必须更改将值存储在 db 中的方式。为什么不使用 Date 数据类型呢?你做事的方式不是好习惯,你会在操作数据时发现问题。 即使您的“我的输入在一列中是 9.30,而另一列是 1.00,它正在添加并在 10.30 中打印数字,就像 10:30 一样”然后只需删除带有冒号的点即可工作。以上是关于Laravel RAW 查询添加多列浮点值的主要内容,如果未能解决你的问题,请参考以下文章