2016-08-31 37 views
1

我想添加到一個日期使用sqldf,我知道它應該很簡單,但我無法弄清楚我的日期格式有什麼問題。使用:R:日期函數在sqldf給予不尋常的答案(錯誤的日期格式?)

sqldf("select date(model_date, '+1 day') from lapse_test") 

給予的答案,如「-4666-01-23」

的model_date的是日期格式,看起來像2015年1月1日

我以前從一個性格使他們字符串('12/1/2015')使用

lapse_test$model_date <- as.Date(lapse_test$date1,format = "%m/%d/%Y") or 
lapse_test$model_date <- as.POSIXCT(lapse_test$date1,format = "%m/%d/%Y") 

我猜這是問題所在?有任何想法嗎?

+0

您可以指定日期方法,以使sql不顯示日期。 'sqldf('從df'選擇一個as_Date',method =「name__class」)' –

+1

sqlite沒有日期類型 - 它只有日期函數。改用H2後端的sqldf(H2確實有日期類型)。請參閱?sqldf和sqldf主頁瞭解更多信息:https://github.com/ggrothendieck/sqldf –

回答

2

傳遞一個字符變量的date()功能似乎工作:

df <- data.frame(a=as.Date("2010-10-01")) 
df$b <- as.character(df$a) 

sqldf("select date(a) from df") 
#  date(a) 
# 1 -4672-08-24 

sqldf("select date(b) from df") 
#  date(b) 
# 1 2010-10-01 

sqldf("select date(b, '+1 day') from df") 
# date(b, '+1 day') 
# 1  2010-10-02 

請注意,你可以做R中直接Date對象(一些)算術,而不需要SQL:

df$a <- df$a + 1 
df 
#   a   b 
# 1 2010-10-02 2010-10-01 
1

SQLite日期函數將日期看作自4714BC的11月24日以來的日期,這意味着在R中的示例日期2015-12-01的整數存儲爲16770將返回4667BC中的某個古代日期。

您可以發現1970-01-01的R原點與SQLite原點之間的差異爲2440588天。 @ HongOoi的回答可能是更好

test <- data.frame(model_date=as.Date("12/1/2015",format="%m/%d/%Y")) 
sqldf("select date(model_date + 2440588, '+1 day') as select_date from test") 
# select_date 
#1 2015-12-02 

,但我想這可能是有趣的,知道底層的工作原理:這意味着,你可以把這個常數考慮在內,如果你想要的。

+0

是的,絕對有用,我感謝您花時間解釋這一點。 – khhc