【问题标题】:Read datetime with offset from SQL Server as datetime in R读取带有 SQL Server 偏移量的日期时间作为 R 中的日期时间
【发布时间】:2021-06-23 18:11:26
【问题描述】:

我在 SQL Server 中有带有日期时间和偏移量的表:

datetime                              Value     Instance
--------------------------------------------------------
2021-06-18 03:48:30.0000000 +08:00    4194304   39069
2021-06-18 03:48:30.0000000 +08:00    1048576   39098
2021-06-18 03:48:30.0000000 +08:00     372736   39076

我正在使用 ODBC 库来查询 SQL。问题 - 我将列日期时间作为字符。我有数百万条记录,所以我花了几分钟时间将 datetime 列转换为 posixct,这对我的任务来说等待时间太长了:

out_data %>% mutate (datetime = as.POSIXct(datetime, tz=Sys.timezone()))

在转换过程中,我也失去了正确的时区。是否有任何模块可以查询 SQL 并将该日期时间格式接收为日期时间?

【问题讨论】:

  • 我在previous question 中的代码已经将此字符串转换为正确的POSIXt 对象。它也适用于事物字符串的向量。 唯一的限制是 R 中的日期时间向量始终显示为相同的时区 ... 但它们都是正确的时间
  • 问题不一定是如何从 SQL Server 查询它(因为odbc 不正确了解DATETIMEOFFSET),你会得到它作为字符串,句号。由于您已经有代码可以将该字符串正确转换为正确的POSIXt,并且我已经确定了 R 存储时间戳向量的限制。也许问题在于您的控制台上的数据呈现
  • 我定期从 SQL Server 中提取 2M 行数据,其中至少有一列(通常为 2-4)列类型为 datetimeoffset,它以 character 的形式出现在我面前(和你一样) .我的过程在几秒钟内而不是几分钟内正确地解析了字符串中的时区(使用gsubformat=,就像在我的answer 中一样)。您提取了多少数据,和/或您如何处理这些数据,以便花费“分钟转换”
  • 您的代码:data_1 % mutate (datetime = as.POSIXct(gsub(" ([-+]\\d{2}):(\\d{2}) ", " \\1\\2", datetime), format = "%Y-%m-%d %H:%M:%OS %z")) 将日期转换为:"2021-06-17 22 :48:30 MSK" 这是正确的日期时间,但时区错误。原来是+8,现在是+3。我需要在 ggplot 图表上显示原始时间 - 03:48:30,而不是 22:38:30。我不需要将 tz 转换为本地的。我需要保持原样。
  • 我不知道该说什么......根据您提供的数据,它不提供“MSK”输出。但是……你没有在你的代码中添加tz=,所以这也许不足为奇?

标签: r sql-server datetime timezone odbc


【解决方案1】:

他们的关键是在 SQL 端解决这个问题。如果 R 接收日期时间格式的数据 - 无需转换。所以我们需要将带偏移量的日期时间转换为日期时间。

SQL 让这变得非常快:

select CAST(datetime AS datetime) as 'datetime', Value, Instance from Perf

【讨论】:

    猜你喜欢
    • 2018-03-10
    • 2015-03-07
    • 2011-05-18
    • 2020-10-24
    • 2018-02-20
    • 2018-03-15
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多