如何在R中使用RODBC从Sql Server读取utc时间戳?

时间:2011-09-20 12:07:03

标签: sql-server r timezone utc rodbc

我正在尝试将一些数据从Sql Server 2008导入到R中,使用RODBC:

db <- odbcDriverConnect(connection = "Driver={SQL Server Native Client 10.0};Server=server; Database=db;Trusted_Connection=yes;")
results <- sqlQuery(db, "select timestamp from table where some-restriction")

数据存储在“datetime”类型的列中。所有时间戳都是UTC,但我的系统时区是CET。 R将所有时间戳转换为“POSIXct”“POSIXt”类型的值,例如:

“2011-01-01 07:24:12 CET”

“2011-01-01 08:35:10 CET”

“2011-01-01 09:02:50 CET”

时间戳是正确的,时区错了。在我看来,由于没有明确指定时区,R将所有时间戳分配给我的本地时区。

有没有办法指定数据的时区,所以时区信息是否正确?

2 个答案:

答案 0 :(得分:5)

之后可能最容易更改时区。

library(lubridate)
tz(results) <- "UTC"

答案 1 :(得分:4)

Pre R 3.1.0,当这个答案最初编写时:

对于类POSIXlt的对象,您可以在导入数据后直接修改变量的tzone属性:

attr(results$timestamp,"tzone") <- "UTC"

如果您的数据属于POSIXct类,则会按时区偏移更改数据,因此首先通过包装POSIXlt转换为as.POSIXlt()

results$timestamp <- as.POSIXlt(results$timestamp)

例如:

tm <- as.POSIXlt(Sys.time())
tm
[1] "2011-09-20 13:45:01 BST"
attr(tm,"tzone") <- "UTC"
tm
[1] "2011-09-20 13:45:01 UTC"

由于R 3.1.0,此行为已更改为使用POSIXlt对象的组件而不是属性,并且在新闻中被斜向引用:

  

日期时间的打印将使用时区缩写   如果知道的话,在当时使用。例如,对于1940年以前的巴黎,这可以   是LMT,PMT,WET或WEST。为了实现这一点,“POSIXlt”类有一个   可选组件“zone”记录每个元素的缩写。

现在你只需使用tm$zone <- "UTC"