【问题标题】:RODBC management of dates from SQL server来自 SQL 服务器的日期的 RODBC 管理
【发布时间】:2015-02-10 00:46:45
【问题描述】:

我有一个 SQL 数据库 (2012),我正试图通过 R (R Studio) 访问它。在 Enterprise Manager 中是这样的:

select top 5[date],value from dbo.history

1991-02-11  11.1591

1991-02-12  11.2

1991-02-13  11.3501

1991-02-14  11.37

1991-02-15  11.3002

但是,我从 R 中得到了:

sqlQuery(DF_CN,'select top 5 [date],value from dbo.history')
         date value
1  0011-02-19 11.16

2  0012-02-19 11.20

3  0013-02-19 11.35

4  0014-02-19 11.37

5  0015-02-19 11.30

当我尝试从表中选择所有数据时,这就是我得到的

sqlQuery(DF_CN,'select * from dbo.history')
Error in charToDate(x) : 
  character string is not in a standard unambiguous format

这可能与 SQL server 中的 yyyy-mm-dd 默认格式有关,如果我使用 CONVERT,我可以更改它,但这看起来像一个 hack,SELECT * 不起作用。

我可以在 R 中做些什么来识别 SQL Server 日期吗?


这让我发疯——肯定有人以前见过——SQL Server 输出与 R 正在读取的内容之间存在明显的脱节。

我正在使用 RStudio 0.98.1091 和 R x64 3.1.2。 数据库服务器 2014 Microsoft SQL Server 管理工作室 12.0.2000.8 Microsoft 数据访问组件 (MDAC) 6.1.7601.17514 微软 MSXML 3.0 4.0 6.0 微软 Internet Explorer 9.10.9200.17148 微软 .NET 框架 4.0.30319.18444 操作系统 6.1.7601

用于 SQL Server 的 ODBC 驱动程序 11。

我的系统上的所有内容都是最新的。

[date] 列的类型为 DATE,现在为 DATETIME。我现在明白了;

sqlQuery(DF_CN,('select * from dbo.history')

 Error in as.POSIXlt.character(x, tz, ...) : 
  character string is not in a standard unambiguous format 

SQL 服务器设置和 R 设置之间似乎有些脱节。

【问题讨论】:

  • 您是在 SQL 表中将日期存储为 DATETIME 值还是 VARCHAR 值?如果是后者,请考虑将它们更改为 DATETIME 值,这应该由 R 更好地处理。
  • 日期在 SQL Server 数据库中存储为 DATETIME

标签: sql-server r date


【解决方案1】:

我通过使用as.is 参数解决了这个问题:

sqlQuery(DF_CN,'select * from dbo.history',as.is=T)

然后在 R 中直接转换我需要的值。

【讨论】:

  • 非常感谢这个建议,它在我的情况下有效! :)
【解决方案2】:

我已经解决了。

驱动程序设置为 SQL server Native Client 11.0 ODBC 设置 - Use regional settings when outputting currency, numbers, dates and times 已关闭。

我认为 SQL Server 对区域设置有自己的想法,而不是 windows 提供的造成很大混乱的想法。

【讨论】:

  • 感谢您抽出宝贵时间回来发布答案,您让互联网变得更智能:)。 SQL Server DATEDATETIME 数据类型没有格式。只有当您选择它们​​时,您才可能选择格式化它们。理想情况下,您永远不会让这些数据成为时间数据类型以外的任何东西,因此您永远不会遇到这个问题。然而,当在不同系统之间移动数据时,这是一个常见的问题。似乎在 Native Client 驱动程序和 R 之间的某个地方,此数据被转换为字符串。
  • 我更改了上面提到的设置,甚至应用了as.is=T,但我仍然收到错误
猜你喜欢
  • 2018-11-08
  • 1970-01-01
  • 2021-12-13
  • 2012-03-04
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多