Преобразование объекта mssql datetime в строку PHP


Я беру некоторую информацию из базы данных, и запись находится в формате MSSQL DateTime, когда я возвращаю ее, она отображается в моем массиве следующим образом:

[arrayItem] => DateTime Object
    (
        [date] => 2008-06-05 09:14:11
        [timezone_type] => 3
        [timezone] => Europe/London
    )

Когда я пытаюсь извлечь это в виде массива (т.Е. $array[arrayItem][date]) Я получаю сообщение об ошибке:

Неустранимая ошибка: Невозможно использовать объект типа DateTime в качестве массива

Я также пробовал форматировать данные в SQL, прежде чем они будут переданы в PHP, и функции strtotime, и у меня не было радости.

Любой рекомендации были бы очень кстати, я рву на себе волосы этим!

Спасибо

Author: SHAZ, 2011-07-12

9 answers

Это тоже пару раз меня настигало.

Надеюсь, это поможет вам, как и мне самому:)

Http://af-design.com/blog/2010/03/13/microsoft-sql-server-driver-for-php-returns-datetime-object/

Вот суть того, что говорится на этой странице, на случай, если ссылка исчезнет.

При запросе столбца, определенного как datetime, собственное расширение PHP SQL Server возвращает строку, где в качестве Microsoft расширение возвращает объект DateTime. Поэтому, если вы ожидаете строку, вам нужно будет соответствующим образом скорректировать свой код.

Далее объясняется, что вы можете просто добавить дополнительный параметр к своим запросам в базу данных, указав, что вы хотите, чтобы ваши даты возвращались в виде строк. Просто добавьте параметр ReturnDatesAsStrings, указав true.

Пример:

$connectionParams = array(
    'USR'=>'user',
    'PASS'=>'pass',
    'Database'='myDatabase',
    'ReturnDatesAsStrings'=>true  //<-- This is the important line
);
$conn = sqlsrv_connect('127.0.0.1',$connectionParams);

Затем вы можете использовать $conn, как обычно, для подключения к базе данных sqlsrv, только даты будут возвращаться в виде строк, а не объектов даты и времени.

В качестве альтернативы, если бы все, что вам было нужно, - это отметка времени вне даты и времени, вы могли бы позвонить:

$myDateTimeObject->getTimestamp();
 22
Author: Brian, 2016-02-01 23:20:50

Вы должны получить к ним доступ, как показано ниже. ассоциативный индекс arrayItem содержит объект, обладающий некоторыми свойствами.

$array['arrayItem']->date;
$array['arrayItem']->timezone_type;
 6
Author: Shakti Singh, 2011-07-12 10:31:54

Поскольку это объект, вы не можете получить свойства, как с массивом. Вам нужен знак -> для доступа к дате. В вашем вопросе кажется, что вы изменили значение переменной $arrayItem, поэтому используйте ее следующим образом:

$date = strtotime($array['arrayItem']->date]);

 2
Author: Sascha Galley, 2011-07-12 10:36:37
echo $array['arrayItem']->format('Y-m-d H:i:s');
 1
Author: osnosn, 2012-10-11 10:22:36

Попробуйте, как это работает для меня:

$array['arrayItem']->format('Y-m-d H:i:s');

Предпочтения: http://php.net/manual/en/datetime.format.php

 1
Author: ron, 2015-03-12 07:17:42

Другое решение - замкнуть цикл.

$_date = \DateTime::createFromFormat('D M d Y H:i:s e+', $the_date);
foreach($_dateStart as $row){
   echo $row; // returns 2014-06-04 15:00
   break;     // stops at the first position
}
 0
Author: Linesofcode, 2014-06-04 14:59:12

Если вы хотите, чтобы 2 отображали данные на странице php, просто скопируйте и вставьте код:

        $serverName = "your_sqlserver";
        $username = "your_username";
        $password = "your_password";
        $database = "your_database";
        $connectionInfo = array( "UID"=>$username, "PWD"=>$password, "Database"=>$database, "ReturnDatesAsStrings"=>true);
        $connection = sqlsrv_connect($serverName, $connectionInfo);

        $result = sqlsrv_query( $connection,"SELECT  * from table'");
        $msrow = sqlsrv_fetch_array($result);

Print_r($msrow['имя_столбца']);

 0
Author: Mahabubur Rahman masum, 2016-05-09 09:07:42

Это функционально и просто в использовании

Вы можете преобразовать дату из объекта даты вместо строки вот как использовать

 $obj->arrayItem->format('H:i:s')


$obj->arrayItem->format('Y-m-d')
 0
Author: Chintan Gor, 2016-06-01 06:32:52

Это сработало для меня

date('Y-m-d', strtotime($rs->Fields('time')->value)

Для подключения Adodb на сервере MSSQL

 0
Author: Sanjay Khadka, 2017-03-24 02:40:45