MySQL到SQL Server:将nvarchar数据类型转换为日期时间


MySQL to SQL Server: The conversion of a nvarchar data type to a datetime

我得到这个错误信息:

将nvarchar数据类型转换为日期时间

当我试图绑定一个MySQL的datetime变量到一个smalldatetime变量在SQL Server语句。代码如下所示:

$s = $dbcnx->prepare("SELECT MAX(attr_81577_) AS max_date FROM object_70969_");
$s->execute();
$r = $s->fetch(PDO::FETCH_ASSOC);
$max_date = $r[max_date]; // we got the maximum date from MySQL table
$s = $dbms->prepare("SELECT * FROM orgs WHERE update_date >= :max_date"); // Now we want to filter SQL Server table based on $max_date value
$s->bindParam(':max_date', $max_date);
$s->execute();

有什么问题,我能做什么?

认为您的SQL Server可能被您正在使用的非标准日期格式所混淆。"2015-09-18 16:22:00"当然是一种相当合理的格式,但它不在SQL Server的标准日期文字格式列表中。

所以,我会尝试使用完全明确的ISO 8601格式,将日期格式化为"2015-09-18T16:22:00"。PHP有一个特定的ISO 8601格式"c",但讽刺的是,这与SQL Server的ISO 8601格式不兼容。所以,尝试:

date('Y-m-d'TH:i:s', strtotime($max_date));

请注意,我不完全确定发生了什么事,因为你使用的日期格式与SQL Server一般工作OK,所以也许这与你的特定服务器配置(日期格式或语言设置?)或PDO有关;我不太了解PDO SQL Server驱动程序。

当然,SQL Server传统上与Microsoft客户端代码一起使用,它将绑定一个实际的date对象到date参数,而不是一个字符串,因此您永远不必担心格式问题。不确定是否有PDO的方法

MySQL期望的日期格式是YYYY-MM-DD,我不确定你得到的Oracle格式是什么。您可能希望PHP使用PHP的stringtotime函数来翻译Oracle日期。

:

$maxDate = date('Y-m-d', strtotime($max_date));

strtotime方法是一个非常棒的小函数,它接受几乎任何格式的日期信息,并尝试将其转换为可用的时间戳。