Php MySQL到SQL Server:nvarchar数据类型到datetime的转换

Php MySQL到SQL Server:nvarchar数据类型到datetime的转换,php,mysql,sql-server,datetime,Php,Mysql,Sql Server,Datetime,我收到以下错误消息: nvarchar数据类型到日期时间的转换 当我尝试将MySQLdatetime变量绑定到SQL Server语句中的smalldatetime变量时。代码如下所示: $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

我收到以下错误消息:

nvarchar数据类型到日期时间的转换

当我尝试将MySQL
datetime
变量绑定到SQL Server语句中的
smalldatetime
变量时。代码如下所示:

$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();

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

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

例如:

$maxDate = date('Y-m-d', strtotime($max_date));
strotime
方法是一个非常好的小函数,它可以获取几乎任何格式的日期信息,并尝试将其转换为可用的时间戳

我认为您的SQL Server可能被您使用的非标准日期格式弄糊涂了。“2015-09-18 16:22:00”当然是一个相当合理的格式,但它是

因此,我会尝试使用完全明确的ISO 8601格式,将日期格式化为“2015-09-18T16:22:00”。PHP对ISO8601有一个特定的格式,“c”,但讽刺的是,这是。因此,请尝试:

date('Y-m-d\TH:i:s', strtotime($max_date));
请注意,我不能完全确定发生了什么,因为您使用的是日期格式,所以这可能与您的特定服务器配置(日期格式或语言设置?)或PDO有关;我对PDO SQL Server驱动程序了解不多


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

错误消息的其余部分是什么?(例如,它可能类似于“…导致了超出范围的值”。您肯定错过了该句的结尾。)那么
$max_date
的实际值是多少?请记住,MySQL的
datetime
的可能范围为1000年1月1日至9999年12月31日,而SQL Server的
smalldatetime
的运行时间为1900年1月1日至2079年6月6日,因此很可能您试图使用超出范围的日期值。(它是否作为
SELECT*FROM orgs WHERE CAST(update_date as datetime)>=:max_date
?)正确,错误消息以
“…导致值超出范围”结尾。这很有趣,但如果我从MySQL表和SQL Server表中打印最大值,那么它们的格式完全相同,如'2015-09-18 16:22:00`您没有在那里引用列名别名$max_date=$r[“max_date”]@非常苍白。它没有区别。当您将它绑定到参数时,
$max\u date
中到底是什么?执行
var\u转储($max\u date)
并向我们显示结果。请记住,这里处理的是日期的字符串表示,而不是实际日期,因此,如果值正确,则可能是一个相当简单的格式问题。不幸的是,这种奇妙的方法无助于解决我的问题。谢谢,它只需稍加更正即可工作。它应该是
date('Y-m-d\TH:i:s',strotime($max\u date))
。鉴于,
date('c',strotime('max_date))
生成的值类似于
2015-09-18T16:22:00+07:00
@Jacobian,需要注意的是,并不是每台服务器都遵循您当前的配置,所以不要低估报价问题,这是我当前的PHP版本5中的一个错误。6@Fevly苍白的。谢谢你,费弗利。我将编辑我的代码,使其在所有配置下都有效。@FevlyPallar-Yup。