【问题标题】:How to read utc timestamps from Sql Server using RODBC in R?如何在 R 中使用 RODBC 从 Sql Server 读取 utc 时间戳?
【发布时间】:2011-11-21 01:01:36
【问题描述】:

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

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")

数据存储在“日期时间”类型的列中。所有时间戳都是 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 将我的本地时区分配给所有时间戳。

有没有什么方法可以指定数据的时区,所以时区信息是正确的?

【问题讨论】:

  • 我没有 RODBC 和要连接的数据库,但您在查询数据库之前尝试过Sys.setenv(TZ="UTC") 吗?
  • Sys.setenv(TZ='UTC') 确实可以工作。还有其他不影响整个系统的选项吗?

标签: sql-server r timezone utc rodbc


【解决方案1】:

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

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

【讨论】:

  • 我接受了@James 的回答,因为它不使用其他库。
【解决方案2】:

Pre R 3.1.0,以及最初编写此答案的时间:

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

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

如果您的数据属于POSIXct 类,这将通过时区偏移量更改数据,因此首先通过包装as.POSIXlt() 转换为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 &lt;- "UTC"

【讨论】:

  • 这会将时间转换为 UTC,因此它会根据区域偏移量更改实际小时数。
  • 我可以确认您的示例确实有效,我不知道为什么它不适用于 db 中的值,可能与缺少 tzone 信息有关。
  • attr(as.POSIXlt(Sys.time()),"tzone") 用于数据库中的值 attr(dbvalue,"tzone") 时打印“CET”“CET”“CEST”打印“”
  • @GregorS。我认为它可以使用 POSIXct 类的对象,默认情况下它没有 tzone 属性。
  • 你是对的,如果首先使用 as.POSIXlt(dbvalues) 将值转换为 POSIXlt,你的解决方案将起作用,你可以编辑答案吗?
猜你喜欢
  • 1970-01-01
  • 2011-12-24
  • 2014-11-21
  • 2015-09-05
  • 2011-05-21
  • 2019-05-02
  • 2017-12-06
  • 2012-04-03
  • 2019-06-05
相关资源
最近更新 更多