Recuperación de los tipos de fecha y hora como objetos de fecha y hora PHP mediante el controlador PDO_SQLSRV
Esta característica, agregada en la versión 5.6.0, solo es válida cuando se utiliza el controlador PDO_SQLSRV para dichos Controladores de Microsoft para PHP para SQL Server.
Al usar PDO_SQLSRV, los tipos de fecha y hora (smalldatetime, datetime, date, time, datetime2 y datetimeoffset) se devuelven de forma predeterminada como cadenas. Ni el atributo PDO::ATTR_STRINGIFY_FETCHES ni PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE tienen ningún efecto. Para recuperar los tipos de fecha y hora como objetos DateTime PHP, establezca el atributo de conexión o instrucción PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE
en true (es false de forma predeterminada).
Nota
Este atributo de conexión o instrucción solo se aplica a la captura normal de tipos de fecha y hora, ya que los objetos DateTime no se pueden especificar como parámetros de salida.
En los siguientes ejemplos se omite la comprobación de errores para una mayor claridad. En este se muestra cómo establecer el atributo de conexión:
<?php
$server = 'myserver';
$databaseName = 'mydatabase';
$username = 'myusername';
$passwd = '<password>';
$tableName = 'mytable';
$conn = new PDO("sqlsrv:Server = $server; Database = $databaseName", $username, $passwd);
// To set the connection attribute
$conn->setAttribute(PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE, true);
$query = "SELECT DateTimeCol FROM $tableName";
$stmt = $conn->prepare($query);
$stmt->execute();
// Expect a DateTimeCol value as a PHP DateTime type
$row = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($row);
unset($stmt);
unset($conn);
?>
En este ejemplo se muestra cómo establecer el atributo de instrucción:
<?php
$database = "test";
$server = "(local)";
$conn = new PDO("sqlsrv:server = $server; Database = $database", "", "");
$query = "SELECT DateTimeCol FROM myTable";
$stmt = $conn->prepare($query);
$stmt->setAttribute(PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE, true);
$stmt->execute();
// Expect a DateTimeCol value as a PHP DateTime type
$row = $stmt->fetch(PDO::FETCH_NUM);
var_dump($row);
unset($stmt);
unset($conn);
?>
Como alternativa, el atributo de instrucción se puede establecer como opción:
<?php
$database = "test";
$server = "(local)";
$conn = new PDO("sqlsrv:server = $server; Database = $database", "", "");
$dateObj = null;
$query = "SELECT DateTimeCol FROM aTable";
$options = array(PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE => true);
$stmt = $conn->prepare($query, $options);
$stmt->execute();
$stmt->bindColumn(1, $dateObj, PDO::PARAM_LOB);
$row = $stmt->fetch(PDO::FETCH_BOUND);
var_dump($dateObj);
unset($stmt);
unset($conn);
?>
En el siguiente ejemplo se muestra cómo lograr lo contrario (que no es realmente necesario, puesto que es false de forma predeterminada):
<?php
$database = "MyData";
$conn = new PDO("sqlsrv:server = (local); Database = $database");
$dateStr = null;
$query = 'SELECT DateTimeCol FROM table1';
$options = array(PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE => false);
$stmt = $conn->prepare($query, $options);
$stmt->execute();
$stmt->bindColumn(1, $dateStr);
$row = $stmt->fetch(PDO::FETCH_BOUND);
echo $dateStr . PHP_EOL;
unset($stmt);
unset($conn);
?>
Recuperación de los tipos de fecha y hora como cadenas con el controlador SQLSRV