首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将ISO8601 TSQL参数与PDO绑定?

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

Stack Overflow用户
提问于 2016-08-19 16:42:09
回答 2查看 1.4K关注 0票数 5

ISO 8601格式的时间戳似乎存在问题。

我正在使用Microsoft ODBC驱动程序13 (预览)用于Server从64位Ubuntu16.04连接PHP7.0.8

这是我的简单桌子:

代码语言:javascript
复制
CREATE TABLE dtest (
    "stamp" DATETIME
);

作品:

代码语言:javascript
复制
$pdoDB = new PDO('odbc:Driver=ODBC Driver 13 for SQL Server;
  Server='.DATABASE_SERVER.';
  Database='.DATABASE_NAME,
  DATABASE_USERNAME,
  DATABASE_PASSWORD
);
$pdoDB->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$sql = "INSERT INTO dtest (stamp) VALUES ('2011-03-15T10:23:01')";
$stmt = $pdoDB->prepare($sql);
$params = [];
$stmt->execute($params);

不起作用:

代码语言:javascript
复制
$sql = "INSERT INTO dtest (stamp) VALUES (?)";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15T10:23:01'];
$stmt->execute($params);

致命错误: Uncaught : SQLSTATE22018:强制转换规范的无效字符值:0 MicrosoftInvalid字符值用于强制转换规范(SQLExecute at SQLExecute)

如果我删除以便'2011-03-15T10:23:01'变成'2011-03-15 10:23:01',那么就可以工作了

代码语言:javascript
复制
$sql = "INSERT INTO dtest (stamp) VALUES (?)";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15 10:23:01'];
$stmt->execute($params);

但是我正在编写一个每晚运行在大约200万张记录上的脚本,所以我真的不愿意承担运行数百万str_replace('T', ' ', $param)的开销

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

代码语言:javascript
复制
$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转换:

作品:

代码语言:javascript
复制
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, '2011-03-15T10:23:02', 126))";
$stmt = $pdoDB->prepare($sql);
$params = [];
$stmt->execute($params);

不起作用:

代码语言:javascript
复制
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, ?, 126))";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15T10:23:02'];
$stmt->execute($params);
EN

回答 2

Stack Overflow用户

发布于 2016-08-19 18:30:37

您将需要使用Server的内置convert()函数,并指定要给它的格式(126):

代码语言:javascript
复制
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, '2011-03-15T10:23:01', 126))";

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

票数 1
EN

Stack Overflow用户

发布于 2017-05-31 09:23:54

在花了半天时间试图解决同样的问题之后,我最终放弃了odbc,转而使用dblib。我安装了php7.0-sybase软件包,修改了我的PDO连接的数据源名称,并为所有人解决了一次。现在所有的束缚都在起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39044034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档