我们必须升级系统以使用PHP7.3(从MSSQL更改为SQLSRV DB驱动程序和带PDO的SQLSRV)
我的问题是,我不明白这种行为,以及如何妥善解决它。
当我从数据库查询DateTime
列时,我得到:
2019-03-26 00:00:00.000
当我尝试将相同的值存储到数据库的DateTime
列中时,它不起作用。我的数据库接受以下格式,例如:
26-03-2019 00:00:00.000
因此,我们现有的数据库层不能正常工作。
我需要帮助来理解此行为,以及如何告诉数据库对查询和INSERT/UPDATE使用相同的格式
我们使用的查询没有特殊的转换,简单的SELECT/UPDATE/INSERT。
PHP版本:PHP 7.3.3 - 1 + ubuntu18.04.1 + www.example.com +1(cli)(构建版本:deb.sury.org+1 (cli) (built: Mar 7 2019 20:31:49) ( NTS )
版权所有(c)1997 - 2018 PHP集团Zend引擎v3.3.3,版权所有(c)1998 - 2018 Zend技术与Zend OPcache v7.3.3 - 1 + ubuntu18.04.1 + www.example.com +1,版权所有(c)1999 - 2018,由Zend技术提供deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
数据库服务器:MSSQL Server 2014
thx为任何提示
1条答案
按热度按时间0wi1tuuw1#
1.1.使用SQL Server的PHP驱动程序PDO_SQLSRV版本从SQL Server检索日期和时间值:
使用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连接或statement属性更改此行为,并将日期和时间字段值作为PHP DateTime变量检索。然后,您可以使用DateTime::format轻松地将此变量格式化为字符串。1.2.使用SQL Server的PHP驱动程序PDO_SQLSRV版本从SQL Server存储过程检索输出参数的日期和时间值:
文档中的注解解释了
PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE
* 连接或语句属性仅适用于日期和时间类型的常规提取,因为DateTime对象不能指定为输出参数 *。在这种情况下,唯一可能的选择是将存储过程的datetime
输出参数作为PHP字符串变量传递。返回值取决于会话的语言环境。存储过程:
PHP语言:
结果:
1.3.使用SQL Server的PHP驱动程序SQLSRV版本从SQL Server检索日期和时间值:
默认情况下,
smalldatetime
、datetime
、date
、time
、datetime2
和datetimeoffset
类型将作为PHP DateTime对象返回,但可以通过在连接字符串或语句级别设置'ReturnDatesAsStrings'
选项来更改此行为:1.4.使用MSSQL PHP扩展从SQL Server检索日期和时间值(PHP 7.0.0中删除了该扩展):
使用MSSQL扩展时,日期和时间值将作为文本返回,但格式取决于
php.ini
文件中的mssql.datetimeconvert
设置。当此选项为ON
时,日期和时间值将根据SQL Server设置进行转换,当为OFF
时,日期和时间值将转换为YYYY-MM-DD hh:mm:ss
。作为附加说明,在您的服务器环境中,此设置似乎是
ON
,因为您可以发送类似'26-03-2019 00:00:00.000'
的日期而不会出错。通常,可以使用明确的日期时间格式(
yyyymmdd
或yyyy-mm-ddThh:mm:ss
)和参数化语句将日期和时间值传递到SQL Server。2.1.使用SQL Server的PHP驱动程序PDO_SQLSRV版本将日期和时间值传递到SQL Server:
2.2.使用SQL Server的PHP驱动程序SQLSRV版本将日期和时间值传递到SQL Server:
使用此版本的驱动程序,您可以使用扩展参数语法,并将datetime值作为PHP DateTime对象传递,其中包含有关参数的PHP和SQL Server数据类型的信息。