如何使 datetime2 与 R 中的 odbc、DBI 一起工作

问题描述 投票:0回答:1

我连接到 SQL Server,其中有一个表,其中有一个列

col_time
,数据类型为
datetime2(7)
,支持 7 位小数(100 ns 精度)。

con <- odbc::odbc() |> DBI::dbConnect(...)

我有时间:

ts <- lubridate::now()
tbl <- tibble::tibble(col_time = ts)

我现在想将其写入我的数据库:

con |> dbWriteTable("test", tbl, append = T)

但是时间只保存到表中保留三位小数。怎么会?如果我直接在 SQL Server Management Studio 中编写 SQL 代码,当然,它可以工作,例如

INSERT INTO TABLE test (col_time) 
VALUES ('2024-01-01T12:34:56.1234567')

发生什么事了?我感觉odbc不支持

datetime2
?我需要改变什么吗?那会有帮助吗?我正在使用驱动程序“ODBC Driver 17 for SQL Server”。

r sql-server odbc
1个回答
0
投票

使用 Native Client 11.0 驱动程序的解决方案,可以从Microsoft此处下载。它可能适用于其他驱动程序,但我只有这个。

首先连接服务器

library(DBI)

con <- dbConnect(

  odbc::odbc(),

  driver = "SQL Server Native Client 11.0",
  server = "...",
  database = "...",
  Trusted_Connection = "Yes"
)

将 R 配置为使用 6 位精度,我认为这是 R 最多可以做到的

options(digits.secs = 6)

由于直接传递时间变量只会导致 3 位小数,因此我们将 ts 转换为包含所有数字的字符串

ts <- lubridate::now()
ts <- toString(ts)

现在按照问题代码进行操作

tbl <- tibble::tibble(col_time = ts)
con |> dbWriteTable("test", tbl, append = T)

如果 SQL Server 上的

col_time
表中的
test
列的数据类型是 datetime2(7),则变量 ts 现在已经以 6 位小数存储在测试表中。

使用SQL Server 2008。

© www.soinside.com 2019 - 2024. All rights reserved.