我们必须升级我们的系统以使用PHP7.3(从MSSQL更改为SQLSRV数据库驱动程序和SQLSRV与PDO)
我的问题是,我不理解这种行为以及如何正确地解决它
当我从数据库查询DateTime字段时,我得到:
2019-03-26 00:00:00.000
当我尝试将相同的值存储到数据库中的DateTime字段时,它不起作用。我的数据库接受此格式,例如:
26-03-2019 00:00:00.000
因此,我们现有的数据库层无法正常工作。
我需要帮助来理解这种行为,以及如何告诉数据库使用相同的Query和INSERT / UPDATE格式
我们使用的查询没有特殊的转换,简单的SELECT / UPDATE / INSERT。
PHP版本:PHP 7.3.3-1 + ubuntu18.04.1 + deb.sury.org + 1(cli)(内置:2017年3月7日20:31:49)(NTS) 版权所有(c)1997-2018 PHP Group Zend Engine v3.3.3,版权所有(c)1998-2018 Zend Technologies与Zend OPcache v7.3.3-1 + ubuntu18.04.1 + deb.sury.org + 1,版权所有(c) 1999至2018年,由Zend Technologies提供
SQLServer:MSSQL Server 2014
thx任何提示
使用PDO_SQLSRV驱动程序时,日期和时间字段中的值将作为驱动程序版本5.6.0之前的字符串返回。在这种情况下,唯一的选择是重新格式化日期和时间值(例如,从'2019-03-26 00:00:00.000'
到'26-03-2019 00:00:00.000'
)。
从5.6.0版开始,您可以使用PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE连接或语句属性更改此行为,并将日期和时间字段值检索为PHP DateTime变量。然后,您可以使用DateTime::format轻松地将此变量格式化为字符串。
文档示例:
<?php
$database = "test";
$server = "(local)";
$conn = new PDO("sqlsrv:server = $server; Database = $database", "", "");
$query = "SELECT DateTimeCol FROM myTable";
$stmt = $conn->prepare($query);
$stmt->setAttribute(PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE, true);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_NUM);
var_dump($row);
?>
使用MSSQL扩展时,日期和时间值将作为文本返回,但格式取决于mssql.datetimeconvert
文件中的php.ini
设置。当此选项为ON
时,日期和时间值将根据SQL服务器设置进行转换,以及何时将OFF
日期和时间值转换为YYYY-MM-DD hh:mm:ss
格式。我认为,这个设置是服务器环境中的ON
,因为你可以发送像'26-03-2019 00:00:00.000'
这样的日期而不会出错。