【问题标题】:Athena / Presto query with date doesn't work with variable带有日期的 Athena / Presto 查询不适用于变量
【发布时间】:2021-10-16 03:20:48
【问题描述】:

没有变量的基本查询可以工作 - 但是在尝试使用变量时我遇到了问题

作品:

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 搜索都指向上述尝试。

【问题讨论】:

  • 如何执行查询?
  • 它通过雅典娜上的 boto 从 jupyter 笔记本运行 - 正如我所说,如果我不尝试可变部分,我可以运行它
  • 请添加代码。
  • 我建议你格式化后打印出myquery的内容。您可能会发现日期的格式不符合您的预期。
  • 很好的建议,我很蹩脚,不比较实际查询 - 发现问题

标签: sql amazon-web-services amazon-athena presto


【解决方案1】:

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

当您在插值周围放置引号时,它们看起来像整数表达式(2021-08-08 是“2021 减 8 减 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 日期的排序方式相同,无论是作为日期还是字符串比较,两者都可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2019-09-19
    • 2020-02-11
    • 2021-11-02
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多