Вы можете достичь этого с помощью чистого scala:
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
val someDateStr = "2020-01-20 00:00:00"
val endDate = LocalDateTime.parse(someDateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
val startDate = endDate.minusDays(6)
startDate
. Это выведет startDate: java.time.LocalDateTime = 2020-01-14T00:00
, тогда вы можете использовать startDate
и endDate
в своем запросе с интерполяцией строк:
val tmp = s"""select id, count(distinct purchase_id) as count_purchases
from my_table
where partition_date between
CAST('${startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))}' AS DATE) and
CAST('${endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))}' AS DATE)
group by 1"""
В качестве альтернативы вы можете использовать встроенную функцию date_sub
вместе с CAST
:
val endDate = "2020-01-20"
val query = s"""select id, count(distinct purchase_id) as count_purchases
from my_table
where partition_date between date_sub(CAST('$endDate' AS DATE), 6) and CAST('$endDate' AS DATE)
group by 1"""
spark.sql(query)