2017-12-15 12 views
0

RPostgreSQLでdatetime処理に問題があります。具体的には、POSIXctオブジェクトに関するもので、UTCのタイムゾーンはpostgresデータベースへのアップロード時に夏時間に自動的に調整されます。簡単な例:RpostgreSQLのタイムゾーンとPOSIXctの処理

library(RPostgreSQL) 

example = data.frame(date=as.POSIXct('2016-08-14 15:50:00',tz='UTC')) 

con = dbConnect(dbDriver("PostgreSQL"), 
       dbname="mydb", 
       host="localhost", 
       port="5432", 
       user="me", 
       password="password") 

dbWriteTable(con,name=c('myschema','mytable'),example,overwrite=T) 

example2 = dbReadTable(con,name=c('myschema','mytable')) 

dbDisconnect(con) 

example2 # 2016-08-14 14:50:00 

この場合、時間は15:50としてエクスポートされますが、午前14時50分ようにリードバック、英国夏時間の夏時間が適用されていることを示唆しています。私はシステム設定をUTCに調整しようとしました.RのタイムゾーンをUTCに設定しました。Sys.setenv(TZ='UTC')を使用し、UTCにUTCにタイムゾーンを設定しました.SET timezone TO 'UTC'を使用しています。

誰かがプロセスのどこで変換が起こりそうで、どこからdbWriteTableがタイムゾーンを取っているのか知っていますか?調整が必要な他の設定に関する提案はありますか?

答えて

0

RPostgreSQLと奇妙な問題があります(UTCは何らかの理由でUTC-4:00となります)。しかし、状況はRPostgresを使ってうまくいくようです。

Rに表示されるタイムゾーンは現地時間であることに注意してください。 RコードとSET TIME ZONE 'GMT';を実行した後でPostgreSQL(たとえば、psql)に行くと、Rに表示された2016-08-14 16:50:00が実際に2016-08-14 15:50:00 UTCとしてデータベースに格納されていることがわかります。つまり、Rに表示される2016-08-14 16:50:00は、私の例ではrubbish_altに対応しています。

crsp=# SET TIME ZONE 'GMT'; 
SET 
crsp=# SELECT * FROM rubbish; 
row.names |   date   
-----------+------------------------ 
1   | 2016-08-14 19:50:00+00 
(1 row) 

crsp=# SELECT * FROM rubbish_alt; 
      date   
------------------------ 
2016-08-14 15:50:00+00 
(1 row) 

crsp=# \d rubbish 
       Table "public.rubbish" 
    Column |   Type   | Modifiers 
-----------+--------------------------+----------- 
row.names | text      | 
date  | timestamp with time zone | 

crsp=# \d rubbish_alt 
      Table "public.rubbish_alt" 
Column |   Type   | Modifiers 
--------+--------------------------+----------- 
date | timestamp with time zone | 

Rコード(Sys.setenv(PGHOST="myhost", PGDATABASE="mydb")などを使用してノートには、他の場所で誰のため、このreprex() -generatedコード実行を作る):

Sys.setenv(TZ='Europe/London') 

# With RPostgreSQL ---- 
library(RPostgreSQL) 
#> Loading required package: DBI 

example <- data.frame(date=as.POSIXct('2016-08-14 15:50:00', tz='UTC')) 

con = dbConnect(PostgreSQL()) 

dbWriteTable(con, 'rubbish', example, overwrite=TRUE) 
#> [1] TRUE 

example2 <- dbReadTable(con, name="rubbish") 

dbDisconnect(con) 
#> [1] TRUE 

example2 
#>     date 
#> 1 2016-08-14 20:50:00 

# With RPostgres ---- 
library(RPostgres) 

example <- data.frame(date=as.POSIXct('2016-08-14 15:50:00', tz='UTC')) 

con = dbConnect(Postgres()) 

dbWriteTable(con, 'rubbish_alt', example, overwrite=TRUE) 

example2 <- dbReadTable(con, name="rubbish_alt") 

dbDisconnect(con) 

example2 
#>     date 
#> 1 2016-08-14 16:50:00 
example2$date[1] 
#> [1] "2016-08-14 16:50:00 BST" 
関連する問題