2014-11-06 55 views
2

我正在将数据从SQL导入到R中。数据包含SQL日期时间格式的列,日期格式如下:2014-10-01 13:00:05。但是,当我使用RODBC软件包将这些数据导入到R中时,R中的列格式化为数据类型POSIXct,并显示如下列:2014-10-01即它不包含小时,分钟或秒。R和SQL:从SQL到R的导入日期和时间

有谁知道如何从SQL导入到R并保持小时,分钟和秒?

请让我知道如果我需要添加任何问题进一步澄清。

感谢

迈克

+0

您是否试图增加'POSIXct'类的数字参数值? – 2014-11-06 15:18:39

+0

不,我该怎么做? – Mike 2014-11-06 15:32:22

+0

[This](http://stat.ethz.ch/R-manual/R-devel/library/base/html/DateTimeClasses.html)可能会有所帮助。 – 2014-11-06 15:37:37

回答

1

我也有这样做的sqlQuery的问题。 如果你的数据集不是太大,简单的解决方法是“as.is”选项。这与调用SQLFetch

sqlFetch(myconn, "table_name", as.is = c(TRUE,TRUE,TRUE,TRUE)) 
1

这可能是工作得很好,由于你的机器的本地时区(Sys.timezone())和你检索数据的时区之间的不匹配。

RODBC使用as.POSIXct,默认情况下使用您机器的当前时区。如果数据中包含任何时间戳,在该时区可能会发生无效或含糊不清的情况。例如,夏令时的转换可能会导致麻烦。

这些做工精细,因为这两个时间标记在当地 时区和UTC明确定义:

> as.POSIXct(c("2016-01-01 00:00:01","2016-03-26 02:30:00")) 
[1] "2016-01-01 00:00:01 CET" "2016-03-26 02:30:00 CET" 
> as.POSIXct(c("2016-01-01 00:00:01","2016-03-26 02:30:00"), tz="UTC") 
[1] "2016-01-01 00:00:01 UTC" "2016-03-26 02:30:00 UTC" 

其中第一个默默滴H:M:S上的所有时间戳,因为 最后时间戳是在本地时区无效:

> as.POSIXct(c("2016-01-01 00:00:01","2016-03-27 02:30:00")) 
[1] "2016-01-01 CET" "2016-03-27 CET" 
> as.POSIXct(c("2016-01-01 00:00:01","2016-03-27 02:30:00"), tz="UTC") 
[1] "2016-01-01 00:00:01 UTC" "2016-03-27 02:30:00 UTC" 

一种解决方案是与as.is来获取数据,然后手动转换为POSIXct指定正确的时区。在这种情况下,数据库包含UTC时间戳:

data <- sqlQuery(mssql, 
       "SELECT timestamp, value FROM table", 
       as.is=c(TRUE, FALSE)) 
data$timestamp <- as.POSIXct(data$timestamp, tz="UTC")