繁体   English   中英

带有日期的 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'

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

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

当您将内插值周围的引号去掉时,它们看起来像 integer 表达式( 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 日期排序相同,无论是作为日期还是字符串进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM