【问题标题】:MySQL greater than with microtime timestampMySQL 大于微时间时间戳
【发布时间】:2011-04-14 12:51:09
【问题描述】:

我有一个 PHP 脚本在 MySQL 数据库中插入行。每行都有一个字段“created_at”,其中填充了 PHP 函数 microtime(true) 的值,并作为双精度值插入。 (微时间,因为我需要比秒更精确的东西)

我有另一个 PHP 脚本,它根据 created_at 字段选择行。

当我继续选择时: SELECT * FROM `ms_voltage` WHERE created_at > 1302775523.51878 我收到了一个结果集,第一行是与 created_at 的值完全相同的行。

当手动执行查询时,这发生在我的 PHP 脚本和 PhpMyAdmin 中。但并非总是如此,也不是每个价值。真的只是偶尔。

这怎么可能?我没有要求大于/等于,我想要严格大于。 我是否忽略了与类型相关的内容?

【问题讨论】:

  • 非常感谢所有(非常快速的)回复。我现在更好地理解了这个问题。我想我将转换为 int 以减轻任何舍入问题,这肯定可以解决问题。再次感谢!

标签: php mysql microtime


【解决方案1】:

是的,浮点运算有时可以做到这一点。要理解其中的原因,了解并非所有数字都可以以 10 为底数准确表示,也不是所有数字都可以以 2 为基数准确表示。

例如,“1/3”可以以 10 为底写为 0.33333 或 0.33334。两者都不是真正的“正确”;他们只是我们能做的最好的。以 10 为底的“DOUBLE”可能是 0.3333333333 或 0.3333333334,这是两位数,但仍不“正确”。

最好的选择是使用 DECIMAL 值,或 使用 INT 值(并将实际值乘以 10000 或 100000 以获得您关心的十进制数字到该 int 中)。

【讨论】:

    【解决方案2】:

    DOUBLE 类型仅表示近似数值数据值。尝试使用 DECIMAL 类型。

    【讨论】:

      【解决方案3】:

      你的列是浮点数吗?用 true 调用 microtime 会给你一个浮点数,它看起来像一个浮点数,在 .51878 之后会有你看不到的数字,所以这些数字使存储的值大于你在查询中的值。

      除非您真的需要浮点数,否则我会将字符串结果转换为 int,甚至将两列转换为秒和 u 秒。然后,您可以在已知值上使用 > 或

      【讨论】:

      • 欢迎来到 SO。我删除了你的个人笔记,因为这在社区中通常是不受欢迎的。不过没什么私人的。另见常见问题解答。干杯
      • 谢谢@Joris Meys - 没问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 2012-06-03
      • 1970-01-01
      • 2014-08-15
      • 2010-12-07
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多