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
相关产品推荐
相关产品推荐

