ReturnDatesAsStrings => true возвращает отметку времени с десятичными и нулями - PullRequest
0 голосов
/ 13 сентября 2018

Я использую PHP 7.2 , MS SQL Server , fpdf и phpSpreadsheet для создания отчетов PDF и Excel из моихданные.Изначально у меня были проблемы с возвратом полей отметок времени (даты) в отчетах, но добавление "ReturnDatesAsStrings"=>true в мой connection.php решило эту проблему.

Теперь проблема заключается в том, что поля даты нак отчетам добавлены десятичные дроби и нули, которые отображаются как 2018-03-01 16:43:19.0000000.Как я могу остановить добавление .0000000?Я не уверен, усложнит ли это, что он также должен работать с fpdf и phpSpreadsheet , но я включил эту информацию на всякий случай.

ОБНОВЛЕНИЕ: Первый ответ Жорова был верным.Я удалил "ReturnDatesAsStrings"=>true из connection.php и файлы phpSpreadsheet отлично работают!К файлам fpdf мне пришлось добавить «$ date_as_string = date_format ($ data ['made_date']», «Ymd H: i: s»);и затем PDF-файлы тоже работают.

ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ: Значения NULL вызывали проблему, но исправление Жорова сработало.Пришлось добавить $date_as_string = is_null($row['DateField']) ? '' : date_format($row['DateField'] , 'Y-m-d H:i:s');

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Используйте ReturnDatesAsStrings => false опцию подключения и date_format() функцию PHP.

Когда ReturnDatesAsStrings равно false, datetime, Date, Time, DateTime2 и DateTimeOffset, типы будут возвращаться как типы PHP Datetime.Поэтому отформатируйте эти поля как даты PHP в произвольном формате.

<?php

# Connection
$server = 'server\instance,port';
$cinfo = array(
    "ReturnDatesAsStrings"=>false,
    "Database"=>'database',
    "UID"=>"uid",
    "PWD"=>"pwd"
);
$conn = sqlsrv_connect($server, $cinfo);
if( $conn === false )
{
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}

# Statement
...
$sql = 'SELECT [DateField] FROM [Table]';
$stmt = sqlsrv_query($conn, $sql);  
if ($stmt === false) {
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}
while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    $date_as_string = is_null($row['DateField']) ? '' : date_format($row['DateField'] , 'Y-m-d H:i:s');

    # I'm not familiar with PhpSpreadsheet, but based on documantation, this should work.
    $spreadsheet->getActiveSheet()->setCellValue('A'.$row , $data->OBJECTID);
    $spreadsheet->getActiveSheet()->setCellValue('B'.$row , $data->Inspector);
    $spreadsheet->getActiveSheet()->setCellValue('C'.$row , $date_as_string);

    echo $date_as_string;
    echo '</br>';
}
...

# End
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
0 голосов
/ 13 сентября 2018

Не парень PHP, но в SQL Server вы можете конвертировать значения даты и времени в строку .

Пример

Select ViaConvert = convert(varchar(19),getdate(),120)
      ,ViaFormat  = format(getdate(),'yyyy-MM-dd HH:mm:ss')

Возвращает

ViaConvert             ViaFormat
2018-09-13 09:35:12    2018-09-13 09:35:12

Обратите внимание: Просто предупреждение, format() имеет некоторые замечательные функции, но не известен как исполнитель.

...