You need to enable JavaScript to run this app. PHP查询MySQL timestamp字段丢失毫秒部分如何解决
优惠活动
大模型
产品
解决方案
定价
更多

PHP查询MySQL timestamp字段丢失毫秒部分如何解决

问题原因

首先确认两个前提:

  • 你的数据库lin_m4表的segundos字段必须是TIMESTAMP(3)类型:MySQL默认的TIMESTAMP不带精度参数时,只会存储到秒,小数部分会直接丢弃,你需要把字段精度设为3(保留3位毫秒),最高可以设为6保留微秒。如果字段已经是带精度的类型,那么问题出在PHP的mysqli扩展读取timestamp字段时默认会截断小数秒部分。
解决方案

方案1:SQL层面格式化(最稳妥,兼容所有环境)

不需要修改PHP配置,直接调整查询语句,用DATE_FORMAT函数把时间字段格式化后返回,修改你的SQL语句为:

SELECT 
  id,
  DATE_FORMAT(segundos, '%Y-%m-%d %H:%i:%s.%f') AS segundos,
  valor
FROM lin_m4 
ORDER BY id DESC 
LIMIT 1

如果只需要保留3位毫秒,可以调整格式化逻辑:

SELECT 
  id,
  CONCAT(
    DATE_FORMAT(segundos, '%Y-%m-%d %H:%i:%s.'),
    LPAD(MICROSECOND(segundos) / 1000, 3, '0')
  ) AS segundos,
  valor
FROM lin_m4 
ORDER BY id DESC 
LIMIT 1

方案2:修改mysqli连接配置

如果你的PHP使用的是mysqlnd驱动(PHP 5.4+默认启用),可以在建立连接后添加配置项,让mysqli保留时间字段的小数部分:
在$conn = new mysqli(...)之后添加如下代码:

$conn->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);

该方案依赖PHP的驱动版本,兼容性不如方案1。

修改后的完整代码示例(采用方案1)
<?php
header("Content-Type: application/json; charset=UTF-8");

$servername="localhost";
$username="root";
$password="something";
$dbname="somethingelse";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
if (!$conn) {
    die("Connection failed: " . $conn->connect_error); 
}

$sql = <<<SQL
SELECT 
  id,
  DATE_FORMAT(segundos, '%Y-%m-%d %H:%i:%s.%f') AS segundos,
  valor
FROM lin_m4 
ORDER BY id DESC 
LIMIT 1
SQL;
$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->get_result();
$outp = $result->fetch_all(MYSQLI_ASSOC);
$outpf = json_encode($outp);
echo $outpf;
$conn->close();
?>

内容的提问来源于stack exchange,提问作者ignacio guirado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 12:15:11