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

问题描述 投票:0回答:1

我们必须升级我们的系统以使用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任何提示

php sql-server sqlsrv
1个回答
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服务器设置进行转换,以及何时将OFF日期和时间值转换为YYYY-MM-DD hh:mm:ss格式。我认为,这个设置是服务器环境中的ON,因为你可以发送像'26-03-2019 00:00:00.000'这样的日期而不会出错。

© www.soinside.com 2019 - 2024. All rights reserved.