Php 如何将ISO8601 TSQL DATETIME参数与PDO绑定?

Php 如何将ISO8601 TSQL DATETIME参数与PDO绑定?,php,sql-server,pdo,odbc,iso8601,Php,Sql Server,Pdo,Odbc,Iso8601,PDO似乎在格式化时间戳方面存在问题 我正在使用 这是我的简单表格: 创建表dtest( “邮票”日期时间 ); 作品: 不起作用: 致命错误:未捕获PDOException:SQLSTATE[22018]:强制转换规范的无效字符值:0[Microsoft][ODBC Driver 13 for SQL Server]强制转换规范的无效字符值(SQLExecute[0]at/build/php7.0-lPMnpS/php7.0-7.0.8/ext/pdo_ODBC/odbcstmt.c:260

PDO似乎在格式化时间戳方面存在问题

我正在使用

这是我的简单表格:

创建表dtest(
“邮票”日期时间
);
作品: 不起作用: 致命错误:未捕获PDOException:SQLSTATE[22018]:强制转换规范的无效字符值:0[Microsoft][ODBC Driver 13 for SQL Server]强制转换规范的无效字符值(SQLExecute[0]at/build/php7.0-lPMnpS/php7.0-7.0.8/ext/pdo_ODBC/odbcstmt.c:260)

如果我删除
T
,那么
'2011-03-15T10:23:01'
将变成
'2011-03-15 10:23:01'

$sql = "INSERT INTO dtest (stamp) VALUES (?)";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15 10:23:01'];
$stmt->execute($params);
但是我正在写一个每晚运行大约200万条记录的脚本,所以我真的不想承担运行数百万条记录的开销

我也尝试过使用,但它给出了相同的错误:

$sql  = "INSERT INTO dtest (stamp) VALUES (:tdate)";
$stmt = $pdoDB->prepare($sql);
$date = '2011-03-15T10:23:01';
$stmt->bindParam(':tdate',$date,PDO::PARAM_STR);
$stmt->execute();
是否仍然可以按原样绑定和执行此参数?我对错误消息有点怀疑,因为它似乎来自SQL Server,好像PDO做得很好,但这没有意义,因为它能够在不进行参数化的情况下处理类型转换


我还尝试了SQL转换:

作品: 不起作用:
您需要使用SQL Server的内置函数,并指定要为其指定的格式(126):

$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, '2011-03-15T10:23:01', 126))";

文档在字符串的末尾提到了
:mmm
,因此您可能需要在日期字符串的末尾手动添加
:000
,这样才能起作用。

在花了半天时间试图解决同一问题后,我放弃了odbc,改用dblib。我安装了php7.0-sybase软件包,修改了PDO连接的数据源名称,并一次性解决了问题。
现在每个绑定都在工作。

谢谢您的回答,但我在尝试
$sql=“INSERT-INTO-dtest(stamp)VALUES(convert(?,126))”时遇到了相同的错误还要注意,unprepared语句在没有转换的情况下工作得很好<代码>$sql=“插入数据测试(戳记)值('2011-03-15T10:23:01')”是绑定过程导致了问题。事实上,这会导致额外的
语法错误或访问冲突:在“@P1”附近有102个不正确的语法。
@JeffPuckettII哇!很抱歉,我应该更仔细地阅读你的问题细节。但这很奇怪。您是否考虑过使用with
PARAM_STR
,看看情况是否有所好转?不,这会产生同样的错误-我已经尝试更新了我的问题。@JeffPuckettII我完全没有主意,mssql驱动程序可能只是有一个未解决的错误:(嗨,运气好吗?@MonkeyZeus没有,但我整个周末都在休息,所以今天我要再试试。祝你好运!让我知道是怎么回事goes@JeffPuckettII你能解决这个问题吗?这不仅仅发生在日期上,而是发生在所有绑定参数上。@Frondor对于这个特殊的问题,我正在导入安全(预消毒)数据,所以我完全跳过了绑定。这不是用户输入的解决方案,所以不,我仍然没有解决它。我只是尽可能避免Microsoft支持不佳的垃圾软件。从技术上讲,这并不是具体问题的答案,但这是一个非常好的解决方案,我非常想“接受”没错,我非常喜欢Sybase驱动程序,很久没有使用ODBC了。但我知道将来会有更多需要ODBC的项目(如DB2),希望有人能特别回答这个问题。
$sql  = "INSERT INTO dtest (stamp) VALUES (:tdate)";
$stmt = $pdoDB->prepare($sql);
$date = '2011-03-15T10:23:01';
$stmt->bindParam(':tdate',$date,PDO::PARAM_STR);
$stmt->execute();
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, '2011-03-15T10:23:02', 126))";
$stmt = $pdoDB->prepare($sql);
$params = [];
$stmt->execute($params);
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, ?, 126))";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15T10:23:02'];
$stmt->execute($params);
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, '2011-03-15T10:23:01', 126))";