我连接到 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”。
使用 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。