你的问题让我有点困惑,所以我提供了两个基于场景的代码。
1) 如果您想过滤介于您提供的列表范围之间的日期,例如从 2017 年 1 月 5 日到 2017 年 1 月 15 日,那么对于这种情况,下面的代码 sn-p 工作。
//Created dataframe view for both data
Seq(("2017-01-10", "2017-01-14"),("2017-01-03","2017-01-13")).toDF("from_date","to_date").withColumn("from_date",'from_date.cast("date")).withColumn("to_date",'to_date.cast("date")).createOrReplaceTempView("date_table")
List("2017-01-05","2017-01-12","2017-01-13","2017-01-15").toDF("list").createOrReplaceTempView("date_list")
spark.sql("select * from date_table where (from_date BETWEEN (select min(cast(list as date)) from date_list) and (select max(cast(list as date)) from date_list)) and (to_date between (select min(cast(list as date)) from date_list) and (select max(cast(list as date)) from date_list))").show()
+----------+----------+
|from_date| to_date|
+----------+----------+
|2017-01-10|2017-01-14|
+----------+----------+
2) 或者,如果您想从 to_date 和 end_date 不在提供的日期列表中的数据框中过滤日期。因此,根据您提供的数据示例,列表之间将没有日期。对于这种情况,下面的代码将起作用。
//Created dataframe view for both data
Seq(("2017-01-10", "2017-01-14"),("2017-01-03","2017-01-13")).toDF("from_date","to_date").withColumn("from_date",'from_date.cast("date")).withColumn("to_date",'to_date.cast("date")).createOrReplaceTempView("date_table")
List("2017-01-05","2017-01-12","2017-01-13","2017-01-15").toDF("list").createOrReplaceTempView("date_list")
spark.sql("select * from date_table where from_date in (select cast(list as date) from date_list) and to_date in (select cast(list as date) from date_list)").show()
+----------+----------+
|from_date| to_date|
+----------+----------+
| | |
+----------+----------+
如果我遗漏了什么,请告诉我。