2016-10-29 60 views
1

我需要使用sqldf包以過濾由日期數據。řsqldf不能識別posixct

我的表, 「情節」 有場「created_at,哪一類是POSIXct

episodes<-data.frame(created_at=seq(from = as.POSIXct('2016-10-01 01:00:00',tz="GMT"), length.out = 100, by = "days")) 

> class(episodes$created_at) 
[1] "POSIXct" "POSIXt" 

我得到的第二個日期:

fechaMin=min(episodes$created_at) 

library(lubridate) 
fechaSig=fechaMin+hours(24) 

然後我用過濾數據:

sqldf("SELECT * from episodes e 
where strftime('%Y/%m/%d', e.created_at, 'unixepoch')>='$fechaSig' ") 

,但我得到的所有數據。該過濾器不工作。

我也嘗試沒有成功:

​​
+0

只有最近的MySQL支持'Datetime'版本這是需要保持'POSIXct' 「在正確的課堂上」 - 所以檢查你的確。對於它的價值來說,PostgreSQL自20世紀90年代以來就有這個價值。 –

+0

@DirkEddelbuettel實際上,在R中創建一個已經在R中創建的表具有相同的問題 - 請參閱該版本。 – GabyLP

回答

1

首先注意到一個庫是存儲包,以便sqldf是一個包,而不是庫的存儲庫。由於library命令的不幸名稱,這通常會造成混淆。

sqldf本身不支持$替換。爲了得到這個結果,你需要使用fn$sqldf,其中fn來自sqldf軟件包自動加載的gsubfn軟件包。它將這種替換添加到它所引用的任何函數的參數中。請參閱?fn

另請注意,SQLite數據庫沒有日期或日期時間類,因此sqldf只是將POSIXct的內部表示形式發送到SQLite,即一個普通數字,表示自Epoch以來相對於GMT的秒數。請注意,即使它顯示相對於不同時區的日期和時間,POSIXct的內部表示始終是自Epoch 相對於GMT以來的秒數。因此episodes$created_atfechSig均被送到從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"