使用R odbc软件包将日期插入Oracle中时,时区偏移并损失毫秒

时间:2019-03-22 18:26:15

标签: r oracle odbc

我正在从使用ROracle软件包切换到使用odbc软件包连接到Oracle。使用ROracle,我能够将具有毫秒的日期时间插入到具有时间戳数据类型的字段的表中。使用odbc软件包,将损失毫秒。另外,当我查询刚刚插入的日期时,时间向前移动了四个小时(我在美国东部,所以大概是在转换为UTC时间)。我已经确认时间已正确插入到Oracle中。是否可以设置一个选项来保留毫秒,并有办法防止时间偏移?

library(odbc)

options(digits.secs = 6)

Sys.setenv(TZ = "EST5EDT",
           ORA_SDTZ = "EST5EDT")

conn <- DBI::dbConnect(odbc::odbc(),
                       driver = "Oracle12c",
                       uid = rstudioapi::showPrompt(title = "username", message = "username", default = ""),
                       pwd = rstudioapi::askForPassword(),
                       dbq = "dbname",
                       timezone = Sys.timezone())

DBI::dbExecute(conn, "create table test_table (datetime timestamp(6))")

df <- data.frame(DATETIME = Sys.time(), stringsAsFactors = FALSE)

# the time has milliseconds in R
print(df)

# insert data
res <- dbSendStatement(conn, "insert into test_table (datetime) values (:1)")
dbBind(res, df)
dbGetRowsAffected(res)
dbClearResult(res)

# the time does not have milliseconds when read back from Oracle and is shifted four hours forward
dbGetQuery(conn, "select * from test_table")    

1 个答案:

答案 0 :(得分:0)

将时间戳记值作为字符串传递并在SQL中将其转换:

insert into test_table (datetime) values (TO_TIMESTAMP(:1, 'DD-MON-YYYY HH24:MI:SS.FF'))

将您的参数作为与TO_TIMESTAMP函数中的格式匹配的字符串进行传递,例如

"22-MAR-2019 17:46:57.123456"

并将日期格式更改为您喜欢的任何格式。

祝你好运