PHP7.3 SQLSRV - Формат DateTime отличается, когда Query and Store - PullRequest
0 голосов
/ 21 марта 2019

мы должны обновить нашу систему для использования 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

Используемые нами Querys не имеют специальных преобразований, Simple SELECT / UPDATE / INSERT.

Версия PHP: PHP 7.3.3-1 + ubuntu18.04.1 + deb.sury.org + 1 (cli) (сборка: 7 марта 2019 г. 20:31:49) (NTS)
Copyright (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, Copyright (c) 1999-2018, Zend Technologies

SQLServer: MSSQL Server 2014

Спасибо за любую подсказку

1 Ответ

3 голосов
/ 21 марта 2019

При использовании драйвера 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' без ошибок.

...