You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP:如何查询显示数据库特定日期?dd/mm/yyyy格式适配MONTH函数问题

解答你的两个MySQL/PHP日期相关问题

问题2:MONTH()函数能否识别dd/mm/yyyy格式的日期?

直接给结论:不能。MySQL的MONTH()函数只能正确处理两种情况的日期:

  • 数据库字段是DATE、DATETIME或TIMESTAMP这类原生日期类型;
  • 字符串格式为yyyy-mm-dd(MySQL默认的可解析日期字符串格式)。

如果你的tarikh字段是用VARCHAR存储的dd/mm/yyyy字符串,MONTH(tarikh)会无法正确解析,大概率返回NULL或者0,这也是你当前查询可能达不到预期的核心原因。


问题1:如何在PHP中选择并显示数据库中的特定日期?

结合你筛选4月记录的需求,分两种场景给出解决方案:

方案1:修改数据库字段类型(强烈推荐)

这是最稳妥、高效的长期方案——把tarikh字段改成DATE类型,这样MySQL所有日期函数都能正常工作,还能避免字符串存储带来的各种问题。

  • 先执行SQL修改字段:
    ALTER TABLE tempahanbilik MODIFY COLUMN tarikh DATE;
    
  • 后续插入日期时,要转成yyyy-mm-dd格式(PHP里可以用date('Y-m-d', strtotime($your_ddmmyyyy_date))转换);
  • 你的查询语句就能正常使用:
    SELECT * FROM tempahanbilik WHERE status != 'BELUM DIPROSES' AND MONTH(tarikh) = 4 ORDER BY tarikh DESC;
    
  • 前端显示时,再把yyyy-mm-dd转回dd/mm/yyyy:
    echo "<tr><td>" . date('d/m/Y', strtotime($row['tarikh'])) . "</td>";
    

方案2:不修改字段,用字符串函数临时解析

如果暂时没法改字段类型,可以用MySQL的STR_TO_DATE()函数把dd/mm/yyyy字符串转成日期类型,再调用MONTH():

  • 修改后的查询语句:
    SELECT * FROM tempahanbilik 
    WHERE status != 'BELUM DIPROSES' 
      AND MONTH(STR_TO_DATE(tarikh, '%d/%m/%Y')) = 4 
    ORDER BY STR_TO_DATE(tarikh, '%d/%m/%Y') DESC;
    
    注意排序也要用STR_TO_DATE(),否则字符串排序会出错(比如01/05/2024会排在30/04/2024前面);
  • 显示时直接输出$row['tarikh']就行,因为存储的就是你要的dd/mm/yyyy格式。

针对你现有代码的修正示例(方案2)

$query = "SELECT * FROM tempahanbilik WHERE status != 'BELUM DIPROSES' AND MONTH(STR_TO_DATE(tarikh, '%d/%m/%Y')) = 4 ORDER BY STR_TO_DATE(tarikh, '%d/%m/%Y') DESC";
$result = $mysqli->query($query) or die($mysqli->error . '_' . __LINE__);
$total = $result->num_rows;
if($total>0) {
    while($row = $result->fetch_assoc()) {
        echo "<tr><td>{$row['tarikh']}</td>";
        // 其他字段的输出逻辑...
    }
}

内容的提问来源于stack exchange,提问作者Hasifah Hassan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:38:51