R:sqldf 中的日期函数给出异常答案(错误的日期格式?)

R: Date function in sqldf giving unusual answer (wrong date format?)

我正在尝试使用 sqldf 添加日期,我知道这应该很简单,但我无法弄清楚我的日期格式有什么问题。使用:

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

给出类似“-4666-01-23”的答案

model_date 的日期格式类似于 2015-01-01

我之前使用

从字符串 ('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")

我猜这是问题所在?有什么想法吗?

将字符变量传递给 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

SQLite 日期函数将日期视为自公元前 4714 年 11 月 24 日以来的天数,这意味着 16770 的整数存储对于示例日期 2015-12-01 在 R returns 某个地方的古老日期公元前 4667 年。

你可以算出 1970-01-01 的 R 源和 SQLite 源之间的差异是 2440588 天。这意味着,如果需要,您可以考虑这个常量:

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

@HongOoi 的回答可能更好,但我认为了解底层工作原理可能很有趣。