PHP7.3 SQLSRV-查询和存储时的DateTime格式不同

时间:2019-03-21 08:24:53

标签: php sql-server sqlsrv

我们必须升级系统以使用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

任何提示的提示

1 个答案:

答案 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'这样的日期而不会出错。