首先注意到一個庫是存儲包,以便sqldf是一個包,而不是庫的存儲庫。由於library
命令的不幸名稱,這通常會造成混淆。
sqldf
本身不支持$替換。爲了得到這個結果,你需要使用fn$sqldf
,其中fn
來自sqldf軟件包自動加載的gsubfn軟件包。它將這種替換添加到它所引用的任何函數的參數中。請參閱?fn
另請注意,SQLite數據庫沒有日期或日期時間類,因此sqldf只是將POSIXct的內部表示形式發送到SQLite,即一個普通數字,表示自Epoch以來相對於GMT的秒數。請注意,即使它顯示相對於不同時區的日期和時間,POSIXct的內部表示始終是自Epoch 相對於GMT以來的秒數。因此episodes$created_at
和fechSig
均被送到從r到SQLite作爲秒大紀元相對於GMT因爲即使他們當R從數據庫接收現場發回(在這一點上不能同時顯示在R.這樣,它只是一個普通數字)sqldf檢查字段名稱是否最初是POSIXct類,如果是,它會強制返回到POSIXct的數字。啓發式不處理時區,因此它存儲爲相對於GMT(因爲所有POSIXct變量都是),並且它顯示在本地時區中,這是POSIXct的默認行爲。
在下面的註釋中,GMT比美國東部時間早4小時,比東部時間早5小時,所以答案是正確的。
episodes <- data.frame(created_at =
seq(from = as.POSIXct('2016-10-01 01:00:00',tz="GMT"), length.out = 100, by = "days"))
fechaMin <- min(episodes$created_at)
library(lubridate)
fechaSig <- fechaMin + hours(24) # or fechaMin+as.difftime(1,units="hours") w/o lubridate
library(sqldf)
out <- fn$sqldf("select * from episodes where created_at >= $fechaSig")
range(episodes$created_at)
## [1] "2016-10-01 01:00:00 GMT" "2017-01-08 01:00:00 GMT"
range(out$created_at)
## [1] "2016-10-01 21:00:00 EDT" "2017-01-07 20:00:00 EST"
如果你喜歡只在GMT工作,然後確保本地時區爲GMT這樣的:
Sys.setenv(TZ = "GMT")
range(out$created_at)
## [1] "2016-10-02 01:00:00 GMT" "2017-01-08 01:00:00 GMT"
只有最近的MySQL支持'Datetime'版本這是需要保持'POSIXct' 「在正確的課堂上」 - 所以檢查你的確。對於它的價值來說,PostgreSQL自20世紀90年代以來就有這個價值。 –
@DirkEddelbuettel實際上,在R中創建一個已經在R中創建的表具有相同的問題 - 請參閱該版本。 – GabyLP