带有日期的 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 日期无论是作为日期还是字符串进行比较,排序都是相同的。
没有变量的基本查询有效 - 但是在尝试使用变量时我 运行 遇到了问题
作品:
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 日期无论是作为日期还是字符串进行比较,排序都是相同的。