使用 sqlsrv 或 mssql 擴展查詢 MSSQL DATETIME 字段時,PHP 返回 DateTime 對象而非字符串:
DateTime Object
(
[date] => 2011-10-20 00:00:00
[timezone_type] => 3
[timezone] => Asia/Chongqing
)
直接 echo 會報錯或顯示不友好。
ini_set("mssql.datetimeconvert", 0); // mssql 擴展
// 或
ini_set("sqlsrv.FormatDecimals", true); // sqlsrv 相關設置
在腳本最開頭設置,影響後續所有查詢。
; 找到並修改
mssql.datetimeconvert = Off
; 或
sqlsrv.FormatDecimals = On
修改後重啟 PHP-FPM/Apache。適用於所有腳本,無需改代碼。
SELECT *, CONVERT(VARCHAR, datetime_field, 120) AS str_datetime FROM table_name
120:格式 yyyy-mm-dd hh:mi:ss(24h),ISO 8601 兼容。121:含毫秒 yyyy-mm-dd hh:mi:ss.mmm。110 (mm-dd-yyyy)、111 (yyyy/mm/dd)、20 (yy-mm-dd)。返回的 str_datetime 即為字符串,PHP 直接使用無需處理。
// 獲取 DateTime 對象後
$dt = $row['datetime_field'];
if ($dt instanceof DateTime) {
echo $dt->format('Y-m-d H:i:s');
}
// 或統一處理函數
function formatMssqlDateTime($val) {
if ($val instanceof DateTime) return $val->format('Y-m-d H:i:s');
if (is_string($val)) return $val;
return '';
}
| 擴展 | PHP 版本 | 特點 |
|---|---|---|
| mssql | ≤ 5.2 | 官方已移除,僅舊項目維護 |
| sqlsrv | 5.3+ | 微軟官方驅動,功能完整,Windows 首選 |
| pdo_sqlsrv | 5.3+ | PDO 接口,跨平台(Linux 需 ODBC 驅動) |
新項目強烈建議使用 pdo_sqlsrv + 參數綁定,安全且可移植。