DBeaver中查询时间大于指定日期时间的SQL写法及列解析报错解决
报错原因
- 该报错和DBeaver客户端无直接关系,本质是SQL逻辑不符合执行规则导致的。
- 标准SQL的执行优先级顺序为:
FROM/JOIN→WHERE→GROUP BY→HAVING→SELECT→ORDER BY - 在
WHERE条件执行时,SELECT阶段定义的列别名datatime还未被生成,数据库无法识别该列,因此抛出列解析失败的错误。 - 从错误ID的格式判断,当前连接的是Presto/Trino类查询引擎,这类引擎严格遵循SQL执行顺序,不支持在
WHERE阶段直接引用SELECT子句中定义的别名。
解决方法
方法1:WHERE子句直接复用时间计算逻辑
无需改动原有查询结构,把WHERE中引用别名的条件替换为原始计算逻辑即可,调整后的SQL:
select timestamp, FROM_UNIXTIME(timestamp / 1000) as datatime, subscription_name, path, value from xx.xxxx where subscription_name = 'xx_xx_xx' and path in (xxx) and FROM_UNIXTIME(timestamp / 1000) > '2021-02-01 00:00:00'
方法2:直接比较原始时间戳(查询性能最优)
存储的timestamp字段为毫秒级Unix时间戳,可将目标过滤时间转换为对应毫秒时间戳做数值比较,避免逐行调用函数计算,大幅提升大表查询效率:
select timestamp, FROM_UNIXTIME(timestamp / 1000) as datatime, subscription_name, path, value from xx.xxxx where subscription_name = 'xx_xx_xx' and path in (xxx) -- '2021-02-01 00:00:00' 对应的毫秒时间戳为1612166400000 and timestamp > 1612166400000
校验技巧:可临时执行
SELECT FROM_UNIXTIME(1612166400)反向核对,确认生成的时间和目标过滤值匹配后再替换即可。
方法3:嵌套子查询引用定义好的别名
如果希望不重复写计算逻辑,可将带别名的查询作为内层子查询,在外层过滤条件中直接使用别名,即可规避别名解析问题:
select * from ( select timestamp, FROM_UNIXTIME(timestamp / 1000) as datatime, subscription_name, path, value from xx.xxxx where subscription_name = 'xx_xx_xx' and path in (xxx) ) base where datatime > '2021-02-01 00:00:00'
内容的提问来源于stack exchange,提问作者Ardavan
相关产品推荐
相关产品推荐

