【问题标题】:Formatting MySQL IF statement with date_format使用 date_format 格式化 MySQL IF 语句
【发布时间】:2021-09-20 09:37:09
【问题描述】:

我有一个 MySQL 查询,它应该计算字段之间的时间差,但是由于该查询,我无法通过接口将其格式化为时间,因此计算不正确,所以我是尝试将 DATE_Format 添加到查询中,但无论我尝试什么,都没有任何效果。

这是我正在使用的查询: IF(`Time Elapsed` < `Speed Fault`, `Speed Fault` - `Time Elapsed`, 0) AS `Under Time` ,

我尝试添加:DATE_FORMAT(`Under Time`, `%i:%s`) 以使字段显示分钟和秒。

当前使用上述查询,它返回正确的秒数,如果差异在 60 秒以下,但如果它例如 3 分钟和 5 秒的差异,则查询返回值 305,依此类推。 .

所以我希望有人可以帮助我。我愿意在 PHP 或 MySQL 中执行此操作。

【问题讨论】:

  • 你不能在同一个查询中使用别名。
  • date_format() 的第一个参数必须是日期时间,而不是秒数。您可以使用FROM_UNIXTIME() 将秒数转换为DATETIME
  • @Barmar - 我没有值,它是从其他 2 个字段即时计算出来的,所以我必须在其中放一个别名才能提取正确的信息,不是吗? ?
  • 您可以将带有别名的查询放在子查询中,然后在主查询中引用别名。
  • 我不确定你的意思是什么@Barmar 我真的只是想弄清楚为什么当我减去两个时间字段时它没有给我正确的信息?

标签: php mysql datetime


【解决方案1】:

进行日期戳算术很棘手。在 MySQL 中,在数值上下文中使用 DATETIME 或 TIMESTAMP 数据(例如,通过从另一个中减去一个)可能会得到奇怪的结果。

我猜你希望你的结果格式像1:23:45,小时/分钟/秒。在这种情况下,这是TIMEDIFF(later, earlier) 的工作。

IF(`Time Elapsed` < `Speed Fault`, 
   TIMEDIFF(`Speed Fault` - `Time Elapsed`),
   SEC_TO_TIME(0)) AS `Under Time`

如果您希望在几秒钟内获得结果,请使用 TIMESTAMPDIFF(unit, earlier, later) 并尝试此操作

 GREATEST(TIMESTAMPDIFF(SECOND,`Time Elapsed`, `Speed Fault`),0) AS `Under Time`

您可能注意到这两个函数的前/后参数顺序相反。数据库时间算术函数就是这样。

并且,请注意格式化的 TIME 数据。它不能显示大于或等于 839 小时的时间间隔。如果您尝试,它会显示838:59:59 而不会警告您。

【讨论】:

  • 谢谢,我会尝试这两种不同的代码,看看它是否按照我想要的方式工作。
  • 所以我尝试了第二个命令,它可以显示秒数,但我想看看 IF 命令是如何工作的,当我尝试它时,我收到以下错误Error executing query. Fatal error: Incorrect parameter count in the call to native function 'TIMEDIFF' 我试过了改变
  • 很奇怪。 AFAIK TIMEDIFF 只有两个参数。但是我多次混淆了 TIMESTAMPDIFF 和 TIMEDIFF 。是这样吗?
  • 我刚刚使用 TIMESTAMPDIFF 再次尝试并收到此错误:MySQL 服务器版本在 'Speed Fault - Time Elapsed)、SEC_TO_TIME(0)) AS Under Time 附近使用正确的语法, Over Time,'
  • 我已经尝试过使用代码,但我没有尝试过任何工作。
猜你喜欢
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2019-04-21
  • 2012-04-12
  • 2016-01-11
  • 2010-10-07
相关资源
最近更新 更多