【问题标题】:MSSQL datetime object won't echo out the correct date if i remove its var_dump如果我删除它的 var_dump,MSSQL 日期时间对象将不会回显正确的日期
【发布时间】:2019-11-14 01:26:43
【问题描述】:

我正在尝试创建一个显示 2019 年 6 月以来数据的简单表格,但是每当我删除我的 var_dump 行时,我都无法让 MSSQL 日期时间行正确回显。

因此,使用 var_dump 我得到了正确的日期,但没有我的所有列都显示为 1970 年的日期,这不存在,但是当我首先对交易日期进行 vardump 时,我在所有行上都得到了正确的结果??

这与我需要将行的格式更改为 PHP 可以理解的格式有关吗?

这是输入 2016-07-04 00:00:00.000 的示例

下面是我的代码。

    <?php
$serverName = "SQL,1433";
$connectionInfo = array( "Database"=>"", "UID"=>"", "PWD"=>"");
$conn = sqlsrv_connect( $serverName, $connectionInfo );


$sql = "SELECT TOP 1 * FROM [all sales data]";
$stmt = sqlsrv_query( $conn, $sql);
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
?>

<?php var_dump( $row['Transaction Date']);?>

<tr>
                    <td><?php echo $row['Order Point Account'];?></td>
                    <td><?php echo $row['Analysis Category'];?></td>
                    <td><?php echo $row['Branch Code'];?></td>
                    <td><?php echo date("d m Y", strtotime($row['Transaction Date']->date));?></td>
                    <td><?php echo $row['Product Discount Group'];?></td>
                    <td><?php echo $row['End Product Cost of Sale'];?></td>
                    <td><?php echo $row['End Product Other Value'];?></td>
                    <td><?php echo $row['End Product Sales Value'];?></td>
                    <td><?php echo $row['End Product Analysis Quantity'];?></td>
                    <td><?php echo $row['Invoice Account'];?></td>
                    <td><?php echo $row['Magic Number'];?></td>
                    <td><?php echo $row['Order Number'];?></td>
                    <td><?php echo $row['PAC Level 1'];?></td>
                    <td><?php echo $row['PAC Level 2'];?></td>
                    <td><?php echo $row['PAC Level 3'];?></td>
                    <td><?php echo $row['PAC Level 4'];?></td>
                    <td><?php echo $row['Product Code'];?></td>
                    <td><?php echo $row['Salesman 1'];?></td>
                    <td><?php echo $row['Statement Account'];?></td>
                    <td><?php echo $row['Supplier Account'];?></td>
                    <td><?php echo $row['Contact']?></td>
                    <td><?php echo $row['Order Source'];?></td>
                    <td><?php echo $row['User'];?></td>
                    <td><?php echo $row['Customer Order No'];?></td>
                </tr>

            <?php
            }
            ?>


            </tbody>
            </table>
    </body>
</html>

下面是vardump

object(DateTime)#1 (3) { ["date"]=> string(26) "2016-07-04 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone "]=> 字符串(13) "欧洲/伦敦" }

这是 print_r($row); 的结果

Array ( [Order Point Account] => [Analysis Category] ​​=> AD [Branch Code] => 100 [Transaction Date] => DateTime Object ( [date] => 2016-07-04 00:00:00.000000 [timezone_type] => 3 [timezone] => Europe/London ) [Product Discount Group] => [End Product Cost of Sale] => 165.19999694824 [End Product Other Value] => 165.2 [End Product Sales Value] => 369.60000610352 [最终产品分析数量] => 1 [发票帐户] => [幻数] => 800713 [销售订单行号] => [订单号] => 319651 [PAC 级别 1] => d [PAC 级别 2] => dLB [PAC Level 3] => dLB01 [PAC Level 4] => dLB0106 [Product Code] => [Salesman 1] => 9500 [Statement Account] => [Supplier Account] => [Contact] => 传真[订单来源] => 传真 [用户] => [客户订单号] => )

【问题讨论】:

  • TOP 没有ORDER BY?
  • 不确定具体的错误是怎么来的……但是如果你已经有一个 DateTime 实例,那么你应该直接使用它的 format 方法,而不是使用 strtotime 先将其解析为时间戳,然后再次使用日期格式化...
  • @Sami 我会在日期字段回显正确后执行此操作。
  • @04FS 能给我举个例子吗?

标签: php sql-server datetime sqlsrv var-dump


【解决方案1】:

当您使用 SQL Server 而非 PDO 版本的 PHP 驱动程序时,您可以通过在连接字符串中指定 ReturnDatesAsStrings 选项将 retrieve date and time types(日期时间、日期、时间、日期时间 2 和日期时间偏移)作为字符串或 PHP 日期时间对象:

<?php 
...
$serverName = "SQL,1433";
$connectionInfo = array(
    "ReturnDatesAsStrings"=>false,
    // Set to TRUE if you want to get date values as string.
    //"ReturnDatesAsStrings"=>true,
    "Database"=>'database',
    "UID"=>"username",
    "PWD"=>"password"
);
$conn = sqlsrv_connect( $serverName, $connectionInfo );
...
?>

默认情况下,ReturnDatesAsStringsfalse,所以你只需要格式化 datetime 对象。

<?php
...
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
   ...
   // Format date with procedural or object oriented style:
   <td><?php echo date_format($row['Transaction Date'], 'd m Y');?></td>
   <td><?php echo $row['Transaction Date']->format('d m Y');?></td>
   ...
}
...

?>

【讨论】:

  • 谢谢你,这很好用,你的救命稻草!
  • @Chris 很高兴为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多