我们必须升级系统以使用PHP7.3(从MSSQL更改为SQLSRV DB Driver和带有PDO的SQLSRV)
我的问题是,我不了解这种行为以及如何正确解决它
当我从数据库中查询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)(内置:Mar 7 2019 20:31:49)(NTS)
版权所有(c)1997-2018 The 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
任何提示的提示
答案 0 :(得分:3)
使用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 Server设置进行转换,而当OFF
日期和时间值时将转换为YYYY-MM-DD hh:mm:ss
格式。我认为,此设置在服务器环境中为ON
,因为您可以像发送'26-03-2019 00:00:00.000'
这样的日期而不会出错。