SQL 使用 BETWEEN 命令查询,在 CRAN R 中到 select 日期
SQL query with the BETWEEN-command, in CRAN R to select dates
ff。示例取自:
https://www.datenbanken-verstehen.de/sql-tutorial/sql-between-befehl/
刚开始在 R 中学习 SQL。我想获取 'newdf.Mitarbeiter4' 中列出的这两个日期之间的日期列表。谁能帮我指出查询中的错误?
关于此查询也有类似的问题,但不知何故我仍然无法使用答案来识别我的错误。
Mitarbeiter4 <- data.frame( Nachname = c( "Wegner", "Müller", "Schulz", "Richter", "Schröder" ),
Vorname = c( "Lutz", "Melanie", "Dorothea", "Heiko", "Lukas" ),
Geburtstag = c( '12.12.1983', '01.04.1978', '13.02.1990', '15.08.1995', '24.07.1980' )
)
Mitarbeiter4
newdf.Mitarbeiter4 <- sqldf( "SELECT Nachname, Vorname, Geburtstag from Mitarbeiter4 WHERE Geburtstag BETWEEN '1980.01.01' AND '1993.01.01' " )
newdf.Mitarbeiter4
这给了我 ff。结果:
[1] Nachname Vorname Geburtstag
<0 Zeilen> (oder row.names mit Länge 0)
我尝试了两个“.”的日期。和其他问题中的“/”,但我这边仍然没有成功。
由于我对正确的格式有疑问,能否请回复我问题的好心人参考上面引用的教程中的结果:
"Das Ergebnis würde wie folgt aussehen:"
转换成Date
class再做
可能会更好
library(sqldf)
Mitarbeiter4$Geburtstag <- as.Date(Mitarbeiter4$Geburtstag, "%d.%m.%Y")
start <- as.Date("1980-01-01")
end <- as.Date("1993-01-01")
fn$sqldf("SELECT Nachname, Vorname, Geburtstag from Mitarbeiter4
WHERE Geburtstag between $start and $end")
# Nachname Vorname Geburtstag
#1 Wegner Lutz 1983-12-12
#2 Schulz Dorothea 1990-02-13
#3 Schröder Lukas 1980-07-24
或使用tidyverse
library(dplyr)
library(lubridate)
Mitarbeiter4 %>%
filter(between(dmy(Geburtstag), as.Date("1980-01-01"), as.Date("1993-01-01")))
# Nachname Vorname Geburtstag
#1 Wegner Lutz 12.12.1983
#2 Schulz Dorothea 13.02.1990
#3 Schröder Lukas 24.07.1980
或在base R
subset(Mitarbeiter4, as.Date(Geburtstag, "%d.%m.%Y") > as.Date("1980-01-01") &
as.Date(Geburtstag, "%d.%m.%Y") < as.Date("1993-01-01"))
# Nachname Vorname Geburtstag
#1 Wegner Lutz 12.12.1983
#3 Schulz Dorothea 13.02.1990
#5 Schröder Lukas 24.07.1980
注意:'Geburtstag' 列上的 as.Date
转换可以在 subset
中的过滤步骤之前完成,以避免多次调用 as.Date
ff。示例取自: https://www.datenbanken-verstehen.de/sql-tutorial/sql-between-befehl/
刚开始在 R 中学习 SQL。我想获取 'newdf.Mitarbeiter4' 中列出的这两个日期之间的日期列表。谁能帮我指出查询中的错误? 关于此查询也有类似的问题,但不知何故我仍然无法使用答案来识别我的错误。
Mitarbeiter4 <- data.frame( Nachname = c( "Wegner", "Müller", "Schulz", "Richter", "Schröder" ),
Vorname = c( "Lutz", "Melanie", "Dorothea", "Heiko", "Lukas" ),
Geburtstag = c( '12.12.1983', '01.04.1978', '13.02.1990', '15.08.1995', '24.07.1980' )
)
Mitarbeiter4
newdf.Mitarbeiter4 <- sqldf( "SELECT Nachname, Vorname, Geburtstag from Mitarbeiter4 WHERE Geburtstag BETWEEN '1980.01.01' AND '1993.01.01' " )
newdf.Mitarbeiter4
这给了我 ff。结果:
[1] Nachname Vorname Geburtstag
<0 Zeilen> (oder row.names mit Länge 0)
我尝试了两个“.”的日期。和其他问题中的“/”,但我这边仍然没有成功。
由于我对正确的格式有疑问,能否请回复我问题的好心人参考上面引用的教程中的结果:
"Das Ergebnis würde wie folgt aussehen:"
转换成Date
class再做
library(sqldf)
Mitarbeiter4$Geburtstag <- as.Date(Mitarbeiter4$Geburtstag, "%d.%m.%Y")
start <- as.Date("1980-01-01")
end <- as.Date("1993-01-01")
fn$sqldf("SELECT Nachname, Vorname, Geburtstag from Mitarbeiter4
WHERE Geburtstag between $start and $end")
# Nachname Vorname Geburtstag
#1 Wegner Lutz 1983-12-12
#2 Schulz Dorothea 1990-02-13
#3 Schröder Lukas 1980-07-24
或使用tidyverse
library(dplyr)
library(lubridate)
Mitarbeiter4 %>%
filter(between(dmy(Geburtstag), as.Date("1980-01-01"), as.Date("1993-01-01")))
# Nachname Vorname Geburtstag
#1 Wegner Lutz 12.12.1983
#2 Schulz Dorothea 13.02.1990
#3 Schröder Lukas 24.07.1980
或在base R
subset(Mitarbeiter4, as.Date(Geburtstag, "%d.%m.%Y") > as.Date("1980-01-01") &
as.Date(Geburtstag, "%d.%m.%Y") < as.Date("1993-01-01"))
# Nachname Vorname Geburtstag
#1 Wegner Lutz 12.12.1983
#3 Schulz Dorothea 13.02.1990
#5 Schröder Lukas 24.07.1980
注意:'Geburtstag' 列上的 as.Date
转换可以在 subset
中的过滤步骤之前完成,以避免多次调用 as.Date