我很努力地理解在R和Postgres之間使用RPostgreSQL
傳遞POSIXct
對象時在幕後發生了什麼。在下面的例子中,我定義了兩個時間戳字段:一個與一個時區另一個沒有。但是,看起來在通過dbWriteTable
和dbReadTable
傳遞POSIXct
對象時,它們的處理方式完全相同。如何在R和Postgres DBMS之間傳遞POSIXct對象時正確處理時區?
library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host = "127.0.0.1", port = "5432", user= "postgres",
dbname = "test_db")
q <- "
CREATE TABLE test_table
(
dttm timestamp without time zone,
dttmtz timestamp with time zone
)"
dbSendQuery(con, q)
# using timezone CET
dttm <- as.POSIXct("2016-01-01 10:20:10", tz="CET")
df <- data.frame(dttm = dttm, dttmtz = dttm)
dbWriteTable(con, "test_table", df, overwrite=FALSE, append=T, row.names=0)
# using timezone UTC
dttm <- as.POSIXct("2016-01-01 14:20:10", tz="UTC")
df <- data.frame(dttm = dttm, dttmtz = dttm)
dbWriteTable(con, "test_table", df, overwrite=FALSE, append=T, row.names=0)
df2 <- dbReadTable(con, "test_table")
兩個字段都完全一樣。看起來好像時區完全被丟棄了。
df2$dttm
[1] "2016-01-01 10:20:10 CET" "2016-01-01 14:20:10 CET"
df2$dttmtz
"2016-01-01 10:20:10 CET" "2016-01-01 14:20:10 CET"
問題:
- 那張究竟是什麼在幕後?
- 我該如何正確地來回傳遞POSIXct的時區?
感謝rosscova。但是,我不確定您是否解決了我和R和Postgres之間的日期時間問題,而不僅僅是更改POSIXct對象的時區。對於後者,有可用的功能,例如, 'lubridate :: with_tz(dttm.utc,「CET」)'。所以不需要寫另一個包裝。 –
對,對不起。我認爲你遇到的問題是R轉換本身。解決R tz轉換問題不解決問題的其餘部分?並感謝'lubridate'解決方案,我需要更熟悉它methinks :) – rosscova