日期列中的 Athena 大于条件

54

我有以下查询语句,我正在尝试在 Athena 上运行。

SELECT observation_date, COUNT(*) AS count
FROM db.table_name
WHERE observation_date > '2017-12-31'
GROUP BY observation_date

然而它产生了这个错误:

SYNTAX_ERROR: line 3:24: '>' cannot be applied to date, varchar(10)

这对我来说似乎有点奇怪。我的查询中是否有错误,还是 Athena 无法在日期列上处理大于运算符?

谢谢!

4个回答

89

在进行比较之前,您需要使用转换操作将日期正确格式化。尝试以下方法:

您需要使用 cast 来格式化日期,以确保比较正常运行。尝试以下操作:

SELECT observation_date, COUNT(*) AS count
FROM db.table_name
WHERE observation_date > CAST('2017-12-31' AS DATE)
GROUP BY observation_date

请在Fiddler中查看:SQL Fidle

更新于2019年7月17日

为了反映评论

SELECT observation_date, COUNT(*) AS count
FROM db.table_name
WHERE observation_date > DATE('2017-12-31')
GROUP BY observation_date

谢谢您的回复,但这并没有解决问题。该列已经是日期类,我认为这是亚马逊 Athena 数据库特有的问题。我可以看到您链接的 fiddle 是设置为 MS SQL Server 的,这是一种不同的 SQL 类型,在那里您的答案是有效的解决方案。 - Eugene Brown
1
@efbbrown,你引用的错误是语法错误。我怀疑这不是Athena的问题。基本上,你正在评估的两个方面的格式不同。如果没有关于你的表格的具体信息(创建语句会很有帮助),我猜测你的日期列格式化为时间戳。如果你确定你的日期格式正确,那么你需要将评估的右侧格式化为日期。 - Barry Piccinni
谢谢Barry,你是对的。我需要将我的评估的RHS转换为日期。WHERE observation_date > CAST('2017-12-31' AS DATE) - Eugene Brown
很高兴能够帮忙。已更新答案以反映这一点。 - Barry Piccinni
不使用 CAST,我会使用 DATE 文字:DATE '2017-12-31',就像在 WHERE observation_date > DATE '2017-12-31' 中一样。 - Piotr Findeisen

21
你也可以使用date函数,它是CAST(x AS date)的方便别名。
SELECT * 
FROM date_data
WHERE trading_date >= DATE('2018-07-06');

2
select * from my_schema.my_table_name where date_column = cast('2017-03-29' as DATE) limit 5

2
我想在这里补充一句,如果你有一个日期列,格式为ISO-8601,例如:2022-08-02T01:46:46.963120Z,那么你可以使用parse_datetime函数。
在我的情况下,查询看起来像这样:
SELECT * FROM internal_alb_logs
WHERE elb_status_code >= 500 AND parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') > parse_datetime('2022-08-01-23:00:00','yyyy-MM-dd-HH:mm:ss')
ORDER BY time DESC

在这里查看更多示例:https://docs.aws.amazon.com/athena/latest/ug/application-load-balancer-logs.html#query-alb-logs-examples

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接