9

R内でROracleを使用してOracleデータベースにアクセスしています。

おそらく夏時間の変更以降、DATE(datetime) Oracle 列が正しく変換されていないことに気付きました (R では Oracle DB よりも 1 時間少なくなります)。

ビネットの 12 ページ(ほとんど理解できません) から、ROracle と R は日時を 1970 年 1 月 1 日 UTC からの秒数として交換し、その後 R はローカルのタイムゾーンに合わせて調整するように見えます。

これが私がすることです

    drv <- dbDriver("Oracle");
    con <- dbConnect(drv, username = Login, password = Pwd, dbname = DB, prefetch=TRUE, bulk_read=1e6);

    test.query <- "SELECT * FROM MYTABLE WHERE ( A > to_date('2008-03-03 12:30:00', 'YYYY-MM-DD HH24:MI:SS') AND A < to_date('2008-03-03 12:40:00','YYYY-MM-DD HH24:MI:SS')  AND [other stuff])"

    test <- dbGetQuery(con, test.query);

    head(test[,c("A","B","C")])
    #                    A                   B                   C
    #1 2008-03-03 11:30:38 2008-03-02 23:00:00 2008-03-02 23:00:00 #HERE IT SHOULD BE +1 HOUR
    #2 2008-03-03 11:30:38 2008-03-02 23:00:00 2008-03-02 23:00:00
    #3 2008-03-03 11:30:41 2008-03-02 23:00:00 2008-03-02 23:00:00
    #4 2008-03-03 11:31:25 2008-03-02 23:00:00 2008-03-02 23:00:00
    #5 2008-03-03 11:31:25 2008-03-02 23:00:00 2008-03-02 23:00:00
    #6 2008-03-03 11:31:34 2008-03-02 23:00:00 2008-03-02 23:00:00

    class(test$A)
    [1] "POSIXct" "POSIXt" 
    attributes(test$A)
    $class
    [1] "POSIXct" "POSIXt" 

これが私のsessionInfo()

    sessionInfo()
    R version 2.15.2 (2012-10-26)
    Platform: x86_64-w64-mingw32/x64 (64-bit)

    locale:
    [1] LC_COLLATE=French_France.1252  LC_CTYPE=French_France.1252    LC_MONETARY=French_France.1252
    [4] LC_NUMERIC=C                   LC_TIME=French_France.1252    

    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     

    other attached packages:
    [1] data.table_1.8.9 ROracle_1.1-7    DBI_0.2-5       

    loaded via a namespace (and not attached):
    [1] tools_2.15.2

管理者から入手した Oracle DB に関する情報は次のとおりです。 オラクルDB

この問題を正しく解決するにはどうすればよいですか (夏の終わりに取り戻さなければならない 1 時間を追加するだけではありません)。

4

2 に答える 2

14

あなたが言及したように、これはRがローカルタイムゾーンに従って行っているタイムゾーン変換です。詳細については、このリンクを参照してください。

http://www.oralytics.com/2015/05/r-roracle-and-oracle-date-formats_27.html

ROracle 経由で接続する前に、これらのシステム変数を設定してみてください

Sys.setenv(TZ = "GMT")
Sys.setenv(ORA_SDTZ = "GMT")
于 2016-12-06T16:21:43.303 に答える