精華區beta R_Language 關於我們 聯絡資訊
[問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 我想使用R的RODBC跟ORACLE資料庫相聯,並且撈回上個月月份的資料。 在我的資料表表單中,有一欄ACTDATE記錄時間,R讀取時是POSIXct格式 假設我想抓上個月份的資料,我該怎麼做? [程式範例]: 程式不長我直接貼 Sys.setenv(TZ = "UTC") #設定時間 dataframe <- sqlQuery(conn, "SELECT ACTDATE,SECTOR,STD,STA FROM TABLE where months(ACTDATE) = months(Sys.Date())-1 Order by ACTDATE ") 感覺一定是怪怪的,但也不知該如何改 [環境敘述]: sessionInfo() R version 3.3.3 (2017-03-06) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 7 x64 (build 7601) Service Pack 1 locale: [1] LC_COLLATE=Chinese (Traditional)_Taiwan.950 LC_CTYPE=Chinese (Traditional)_Taiwan.950 [3] LC_MONETARY=Chinese (Traditional)_Taiwan.950 LC_NUMERIC=C [5] LC_TIME=Chinese (Traditional)_Taiwan.950 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] mail_1.0 xlsx_0.5.7 xlsxjars_0.6.1 rJava_0.9-8 RODBC_1.3-14 loaded via a namespace (and not attached): [1] tools_3.3.3 [關鍵字]: RODBC -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.53.249 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1492162948.A.C39.html
carl090105: 看你的寫法應該是要先把SQL語句組好吧,請用pase/pas 04/14 18:12
carl090105: te0將字串組好 04/14 18:12
obarisk: 請想辦法用sql解掉,例如設個sql的變數是上個月的year mo 04/14 20:19
obarisk: nth,再比對 04/14 20:19
obarisk: 這問題和r沒什麼關係,除非你直接倒出近兩個月資料,再到 04/14 20:20
obarisk: r裡篩選 04/14 20:20
bluecadence: 要抓上個月,年份也要考慮吧,你的ACTDATE欄位 04/14 22:01
bluecadence: 應該是datetime格式吧 04/14 22:01
bluecadence: x<-unlist(strsplit(as.character(Sys.Date()),"-")) 04/14 22:02
bluecadence: query_str <- paste0('SELECT ACTDATE,SECTOR,STD,ST 04/14 22:02
bluecadence: A FROM TABLE where YEAR(ACTDATE) = ', x[1], ' and 04/14 22:03
bluecadence: MONTH(ACTDATE) = ', x[2]-1) 04/14 22:03
celestialgod: Oracle資料庫推薦用ROracle 只是要自己編譯而已 04/14 22:03
bluecadence: sqlQuery(conn, query_str) 04/14 22:04
celestialgod: 但是用起來方便很多,而且Oracle宣稱快7X 04/14 22:04
celestialgod: 倍 04/14 22:04
bluecadence: 我這樣寫很cheap,遇到一月會有問題。應該是要轉成 04/14 22:10
bluecadence: 時間格式,正確減去一個月才是 04/14 22:12
celestialgod: 樓上 直接用trunc(ACTDATE, 'MM')就好 04/14 22:14
celestialgod: 跟 trunc(SYSDATE, 'MM') 04/14 22:14
bluecadence: 謝謝天神 04/14 22:15
giock18: 感謝諸位大神 我趕快來試試 04/15 09:10
> -------------------------------------------------------------------------- < 作者: celestialgod (天) 看板: R_Language 標題: Re: [問題] RODBC做sqlQuery時,時間條件的設定 時間: Fri Apr 14 22:07:39 2017 ※ 引述《giock18 (小武)》之銘言: : [問題類型]: : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : : [軟體熟悉度]: : 入門(寫過其他程式,只是對語法不熟悉) : [問題敘述]: : 我想使用R的RODBC跟ORACLE資料庫相聯,並且撈回上個月月份的資料。 : 在我的資料表表單中,有一欄ACTDATE記錄時間,R讀取時是POSIXct格式 : 假設我想抓上個月份的資料,我該怎麼做? : [程式範例]: : 程式不長我直接貼 : Sys.setenv(TZ = "UTC") #設定時間 : dataframe <- sqlQuery(conn, "SELECT ACTDATE,SECTOR,STD,STA : FROM TABLE : where months(ACTDATE) = months(Sys.Date())-1 : Order by ACTDATE ") 同時比較年跟月的話可以用 trunc 代替 如果用ROracle可以這樣寫: library(ROracle) Sys.setenv(TZ = "Asia/Taipei", ORA_SDTZ = "Asia/Taipei") df <- dbGetQuery(conn, "SELECT ACTDATE,SECTOR,STD,STA FROM TABLE where trunc(ACTDATE, 'MM') = trunc(:SYS_DATE, 'MM')-1 order by ACTDATE", data.frmae(SYS_DATE = Sys.Date())) 但是其實Oracle SQL改成下面這樣就可以跑了: SELECT ACTDATE,SECTOR,STD,STA FROM TABLE where trunc(ACTDATE, 'MM') = trunc(SYSDATE, 'MM') - 1 order by ACTDATE ROracle其他好處像是: 1. 不需要像是ODBC要去config系統參數,直接使用TNSNAME就可以連線 2. 更多方便的API可以使用 3. 效能比RODBC好 其他參考這篇: https://blogs.oracle.com/R/entry/r_to_oracle_database_connectivity 我寫過一篇相關的blogger,可以參考一下:https://goo.gl/2avjU2 但是是在linux上編譯 -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9 data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.246.26.70 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1492178863.A.5D8.html
locka: 推~是說印象中RODBC只能在32位元的R上跑的樣子,現在還是嗎? 04/14 22:26
我不知道耶,我一開始就直接摒棄RODBC了XD 直接奔向ROracle懷抱 我對設定那些ODBC感到不耐煩... ROracle真的太方便XD ※ 編輯: celestialgod (111.246.26.70), 04/14/2017 22:51:33