所以这很奇怪.如果结果集足够大,RODBC似乎会删除DateTime SQL列的时间部分.(查询是针对SQL Server 2012计算机运行的,是的,当我在SQL Server端运行它们时,无论返回多少行,它们都会生成相同且正确的结果.)
例如,以下工作完美:
myconn <- odbcConnect(dsnName, uid, pwd)
results <- sqlQuery(myconn, "SELECT TOP 100 MyID, MyDateTimeColumn from MyTable ORDER BY MyDateTimeColumn DESC")
close(myconn)
Run Code Online (Sandbox Code Playgroud)
在R中,以下按预期工作:
> results$MyDateTimeColumn[3]
[1] "2013-07-01 00:01:22 PDT"
Run Code Online (Sandbox Code Playgroud)
这是一个有效的POSIXct约会时间.但是,当返回介于10,000到100,000行之间时,突然时间部分消失:
myconn <- odbcConnect(dsnName, uid, pwd)
bigResults <- sqlQuery(myconn, "SELECT TOP 100000 MyID, MyDateTimeColumn from MyTable ORDER BY MyDateTimeColumn DESC")
close(myconn)
Run Code Online (Sandbox Code Playgroud)
(相同的代码,只返回更多的行; 注意:完全相同的行现在已经丢失了它的时间组件),R响应:
> bigResults$MyDateTimeColumn[3]
[1] "2013-07-01 PDT"
Run Code Online (Sandbox Code Playgroud)
请注意,现在缺少时间(这不是一个不同的行;它与前一行完全相同),如下所示:
>strptime(results$TriggerTime[3], "%Y-%m-%d %H:%M:%S")
[1] "2013-07-01 00:01:22"
>strptime(bigResults$TriggerTime[3], "%Y-%m-%d %H:%M:%S")
[1] NA
Run Code Online (Sandbox Code Playgroud)
显然,解决方法是增量查询附加或导出到CSV和导入到R,但这似乎很奇怪.有没有见过这样的人?
配置:我使用的是最新版本的RODBC(1.3-10),可以复制在Windows x64上运行的R安装和在Mac OS X 10.9(Mavericks)上运行的R安装的行为.
编辑#2dput()根据请求添加比较对象的输出:
> dput(results[1:10,]$MyDateTimeColumn)
structure(c(1396909903.347, 1396909894.587, 1396909430.903, 1396907996.9, 1396907590.02, 1396906077.887, 1396906071.99, 1396905537.36, 1396905531.413, 1396905231.787), class = c("POSIXct", "POSIXt"), tzone = "")
> dput(bigResults[1:10,]$MyDateTimeColumn)
structure(c(1396854000, 1396854000, 1396854000, 1396854000, 1396854000, 1396854000, 1396854000, 1396854000, 1396854000, 1396854000), class = c("POSIXct", "POSIXt"), tzone = "")
Run Code Online (Sandbox Code Playgroud)
看起来底层数据实际上是由于查询返回的行数而发生变化,这是非常奇怪的.