方法: PDO_SQLSRV ドライバーを使用して日付/時刻型を PHP DateTime オブジェクトとして取得する

PHP ドライバーのダウンロード

バージョン 5.6.0 で追加されたこの機能は、Microsoft SQL Server 用 Drivers for PHP の PDO_SQLSRV ドライバーの利用時にのみ有効です。

DateTime オブジェクトとして日付と時刻の型を取得するには

PDO_SQLSRV の利用時、日付と時刻の型 (smalldatetimedatetimedatetimedatetime2datetimeoffset) は既定で文字列として返されます。 PDO::ATTR_STRINGIFY_FETCHES 属性と PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE 属性のどちらにも効力がありません。 PHP DateTime オブジェクトとして日付と時刻の型を取得するには、接続またはステートメント属性 PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPEtrue に設定します (既定では false)。

Note

DateTime オブジェクトは出力パラメーターとして指定できないため、この接続またはステートメント属性は、日付/時刻型の通常のフェッチにのみ適用されます。

例 - 接続属性の使用

次の例では、わかりやすくするため、エラー チェックを省略しています。 この例からは、接続属性の設定方法がわかります。

<?php
$server = 'myserver';
$databaseName = 'mydatabase';
$username = 'myusername';
$passwd = 'mypasword';
$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);
?>

例 - ステートメント属性の使用

この例からは、ステートメント属性の設定方法がわかります。

<?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);
?>

例 - ステートメント オプションの使用

代わりに、ステートメント属性をオプションとして設定できます。

<?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);
?>

例 - 文字列として datetime 型を取得する

次の例からは、逆に変換する方法がわかります (既定では false であるため、これは実際には不要です)。

<?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);
?>

参照

データの取得

SQLSRV ドライバーを使用して日付/時刻型を文字列として取得する