【问题标题】:Format int as date in presto SQL在 presto SQL 中将 int 格式化为日期
【发布时间】:2021-10-14 00:40:39
【问题描述】:

我有一个整数日期列“date_created”存储值,如...

20180527, 20191205, 20200208

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

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

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

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

感谢您对实现这一目标的最佳方式的任何想法

【问题讨论】:

    标签: sql presto


    【解决方案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-05-27
    

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

    【讨论】:

    • 这种方法会产生一个问题,即由于某种原因,月份总是转换为一月。即使在答案中也会发生同样的情况。
    • @NeelotpalShukla 这是一个错误的模式。更新。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        另外,假设我们有date 格式为20211011_1234 并且我们想要一个月前的日期并想要返回原始格式,我们可以使用以下格式将date 转换为int,反之亦然。

        select cast(date_format(
        CAST(parse_datetime(cast(
        split_part('20211011_1234', '_', 1) as varchar), 'yyyyMMdd') 
        AS date) - interval '30' day ,'%Y%m%d') as int) as column_name 
        

        【讨论】:

          猜你喜欢
          • 2017-02-14
          • 1970-01-01
          • 2020-06-22
          • 1970-01-01
          • 1970-01-01
          • 2020-06-04
          • 2023-01-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多