在Presto SQL中将int格式化为日期

时间:2018-12-22 09:32:19

标签: sql presto

我有一个整数日期列“ date_created”,其中存储的值类似于...

20180527, 20191205, 20200208

我想知道解析为日期的最佳方法是什么,以便我可以在查询中做类似的事情...

select * from table where formatted(date_created) > formatted(date_created) - 90

(以返回过去90天内的所有内容)

我发现了一些类似的示例,这些示例从代表秒或毫秒的日期整数转换,但是没有一个列实际上是存储为整数的日期字符串。

赞赏有关实现此目标的最佳方法的任何想法

3 个答案:

答案 0 :(得分:2)

您可以在整数或日期的世界中进行比较。您最好将当前日期减去90天转换为数字:

select t.*
from t
where date_created >= cast(date_format(current_date - interval '90 day',
                                       '%Y%m%d'
                                      ) as int
                          );

答案 1 :(得分:1)

以下查询对任何数据库都是索引友好的,因为它不使用索引列上的功能

select * from table where date_created > timestamp (formatted(date) - 90)

答案 2 :(得分:1)

  

我想知道解析为日期的最佳方法是什么,以便我可以在查询中做类似的事情...

您可以使用以下方式将“日期转换为数字”(例如,20180527为2018年5月27日):

  1. 广播到varchar
  2. parse_datetime并采用适当的格式
  3. 到目前为止的广播(因为parse_datetime返回timestamp

示例:

presto> SELECT CAST(parse_datetime(CAST(20180527 AS varchar), 'YYYYMMDD') AS date);
   _col0
------------
 2018-01-27

但是,这不一定是查询数据的最佳方法。通过使搜索条件适应数据的格式(反之亦然),可以从谓词下推和分区修剪中受益。有关如何执行此操作的信息,请参见@GordonLinoff答案。