Преобразование объекта 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 не доставили мне удовольствия.

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

Спасибо

Ответ 1

Это поймало меня пару раз тоже.

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

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, в качестве строк будут возвращаться только даты, а не объекты DateTime.

С другой стороны, если вам нужна только временная метка из даты, которую вы могли бы вызвать:

$myDateTimeObject->getTimestamp();

Ответ 2

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

$array['arrayItem']->date;
$array['arrayItem']->timezone_type;

Ответ 3

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

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

Ответ 5

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

Ответ 6

Другим решением является цикл.

$_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
}

Ответ 7

Если вы хотите отобразить данные на странице PHP, просто скопируйте и вставьте код <?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['column_name']);

Ответ 8

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

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

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

Ответ 9

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

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

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