Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php returnDateSasString=>;true返回带小数的时间戳&;零_Php_Sql Server_Fpdf_Sqlsrv_Phpspreadsheet - Fatal编程技术网

Php returnDateSasString=>;true返回带小数的时间戳&;零

Php returnDateSasString=>;true返回带小数的时间戳&;零,php,sql-server,fpdf,sqlsrv,phpspreadsheet,Php,Sql Server,Fpdf,Sqlsrv,Phpspreadsheet,我正在使用PHP7.2、MS SQL Server、fpdf和PHPSReadSheet创建数据的PDF和Excel报告。最初,我在返回报告中的时间戳(日期)字段时遇到问题,但在我的connection.php中添加“ReturnDatesAsStrings”=>true解决了这个问题 现在的问题是,报告上的日期字段添加了十进制和零,显示为2018-03-01 16:43:19.0000000。如何停止添加.0000000?我不确定这是否会使它变得更复杂,因为它还需要使用fpdf和phpSpre

我正在使用PHP7.2、MS SQL Server、fpdf和PHPSReadSheet创建数据的PDF和Excel报告。最初,我在返回报告中的时间戳(日期)字段时遇到问题,但在我的connection.php中添加
“ReturnDatesAsStrings”=>true解决了这个问题

现在的问题是,报告上的日期字段添加了十进制和零,显示为
2018-03-01 16:43:19.0000000
。如何停止添加
.0000000
?我不确定这是否会使它变得更复杂,因为它还需要使用fpdfphpSpreadsheet,但为了以防万一,我包含了这些信息

更新:Zhorov的第一个答案是正确的。我从connection.php中删除了
“ReturnDatesAsStrings”=>true
,phpsReadSheet文件工作得很好!在fpdf文件中,我必须添加“$date_as_string=date_格式($data['created_date'],'Y-m-dh:I:s');”然后PDF也可以工作


最终解决方案:空值导致出现问题,但Zhorov的修复方案有效。必须将
$date\u添加为\u string=is\u null($row['DateField'])?“”:日期格式($row['DateField'],'Y-m-dh:i:s')

不是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()
有一些很好的功能,但它不被认为是执行者。

使用
returndatesassstrings=>false
连接选项和
date\u format()
PHP函数

returndatesString
false
时,
datetime
Date
Time
DateTime2
DateTimeOffset
类型将作为PHP日期时间类型返回。因此,使用自定义格式将这些字段格式化为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);
?>

您可以尝试使用三个单独的$spreadsheet->getActiveSheet()->setCellValue('A'.$行,一些值);电话。请参阅更新的答案。如果我使用sqlsrv_fetch_数组而不是sqlsrv_fetch_对象,则错误为“尝试获取非对象的属性'OBJECTID…”从db连接中删除“ReturnDatesAsStrings”=>true修复了excel报告的问题!所以现在我所要做的就是在fpdf中使用日期格式代码,一切正常!!您知道为什么这会在时间戳字段上工作,而不是在常规日期字段上工作吗?当我尝试插入其他日期字段(其中日期是通过日期选择器输入的)时,它告诉我“类DateTime的对象无法转换为字符串。”但如果我使用“ReturnDatesAsStrings”=>true,它将起作用,但将再次添加.0000000。我认为这与这些字段中的空值有关。@KVarney查看更新的答案,并检查空DateTime对象。也许这会有帮助。这将适用于所有日期时间字段。