带有日期的 Athena / Presto 查询不适用于变量

Athena / Presto query with date doesn't work with variable

没有变量的基本查询有效 - 但是在尝试使用变量时我 运行 遇到了问题

作品:

myquery = "SELECT * FROM  x where range between '2021-08-08' and '2021-08-09'

尝试 1:

start_date = '2021-08-08'
end_date = '2021-08-09'
        
myquery = "SELECT * FROM  x where range between date '{start_date}' and date '{end_date}'
myquery =  myquery.format(start_date = start_date, end_date = end_date)
        
Error - Cannot check if varchar is BETWEEN date and date'

尝试 2:

myquery = "SELECT * FROM  x where range between date ({start_date}) and date ({end_date})
myquery =  myquery.format(start_date = start_date, end_date = end_date)
        
Error- Unexpected parameters (integer) for function date. Expected: date(varchar(x)) , date(timestamp) , date(timestamp with time zone)

尝试 3:

myquery = "SELECT * FROM  x where range between CAST ({start_date} AS DATE) and CAST({end_date} AS DATE)
myquery =  myquery.format(start_date = start_date, end_date = end_date)

Error : Cannot cast integer to date'

尝试 4:

myquery = "SELECT * FROM  x where range between {start_date} and {end_date}
myquery =  myquery.format(start_date = start_date, end_date = end_date)

Error: Cannot check if varchar is BETWEEN integer and integer'

对我需要修改的内容的任何见解 - 所有 SO 搜索都指向上述尝试。

第一个查询有效,因为您测试一个字符串是否在两个字符串之间('2021-08-08' 是一个字符串文字),但其他查询将内插值声明为日期(DATE '2021-08-08' 是一个日期文字)。

当您将内插值周围的引号去掉时,它们看起来像整数表达式(2021-08-08 是“2021 minus 8 minus 8”),这会导致您遇到其他一些错误。

您可以通过删除强制转换或添加另一个强制转换以使 range 值成为日期来修复您的查询:

myquery = "SELECT * FROM x WHERE range BETWEEN '{start_date}' and '{end_date}'

myquery = "SELECT * FROM x WHERE CAST(range AS DATE) BETWEEN DATE '{start_date}' and DATE '{end_date}'

两者都适用,因为 ISO 8601 日期无论是作为日期还是字符串进行比较,排序都是相同的。