【问题标题】:How can I get Quarter to Date in Hive SQL?如何在 Hive SQL 中获取季度至今?
【发布时间】:2017-05-15 15:42:43
【问题描述】:

我很难从 Hive SQL 获取季度至今的值。 如何在 Hive sql 中获取当前季度的第一天?

表名:订单

字段:日期、订单编号、销售编号

请指教。

【问题讨论】:

    标签: sql hive hql


    【解决方案1】:

    这似乎是最干净的方式

    with t as (select date '2016-08-27' as dt) 
    select add_months(trunc(dt,'MM'),-(month(dt)-1)%3) from t
    ;
    

    2016-07-01


    这里还有 2 个选项

    with t as (select date '2016-08-27' as dt) 
    select  trunc(add_months(dt,-(month(dt)-1)%3),'MM') 
    from    t
    ;
    

    2016-07-01


    with t as (select date '2016-08-27' as dt) 
    select  add_months(trunc(dt,'YY'),cast((month(dt)-1) div 3 * 3 as INT)) 
    from    t
    ;
    

    2016-07-01

    对于早期版本

    with t as (select '2016-08-27' as dt)
    select  printf('%04d-%02d-%02d',year(dt),(((month(dt)-1) div 3) * 3) + 1,1)
    from    t
    

    2016-07-01

    同样的,但在今天

    with t as (select from_unixtime(unix_timestamp(),'yyyy-MM-dd') as today)
    select  printf('%04d-%02d-%02d',year(today),(((month(today)-1) div 3) * 3) + 1,1) as 
    from    t
    

    2017-04-01

    【讨论】:

    • 您好,非常感谢您的快速回复。那将是理想的答案。唯一的问题是我当前使用的 hive sql 版本是旧版本,不支持函数“add_months”和“trunc”。您知道不使用 'add_months' 和 'trunc' 的不同方法来实现预期结果吗?
    • 嗨 Dudu,感谢您的后续回答。我尝试了您对早期 hive sql 版本的查询,我得到了正确的答案。但是,我希望我的查询没有硬编码日期,例如“2016-08-27”,因为随着时间的推移,例如第三季度到来,我希望我的查询自动更新。你知道怎么做吗?非常感谢您的帮助。谢谢!
    • 此日期仅用于演示。您的查询应该类似于select printf('%04d-%02d-%02d',year(dt),(((month(dt)-1) div 3) * 3) + 1,1) from orders(将dt 替换为相关列)
    • 嗨 Dudu,是的,我还将“2016-08-27”替换为“日期”列。所以我的查询如下所示: select printf('%04d-%02d-%02d',year(date),(((month(date)-1) div 3) * 3) + 1,1) as date from订单 我的日期字段的日期值可以追溯到 2013-01-01。因此,当我运行此查询时,我得到所有季度的第一天,最早可以追溯到 2013 年 1 月 1 日。您是否知道一种调整查询的方法,以便我只能获得当前季度的季度第一天?所以在这种情况下是 2017 年 4 月 1 日
    • 非常感谢嘟嘟。这非常有效。最后一件事,除了这一年,你知道怎么做吗?所以我想得到当年的第一天。所以它会给 2017 年 1 月 1 日
    【解决方案2】:

    如果你不能使用嘟嘟建议的各种日期函数,你总是可以将它转换为字符串,解析出月份,并使用case语句。根据您的 Hive 版本,您可能必须使用简单大小写而不是搜索。

    (假设 YYYY-MM-DD)

    case cast (substring (cast(<date field> as varchar(10)),6,2) as integer)
    when between 1 and 3 then 1
    when between 4 and 6 then 2
    when between 7 and 9 then 3
    else 4
    end
    

    丑陋,但应该可以。

    【讨论】:

    • 感谢 Andrew,当我运行您的查询时,我会得到相应季度的日期。这是伟大的。为此,我还使用以下内容:ceil(month(date)/3.0)。现在,我怎样才能只获得当前季度的第一天?因此,对于当前季度,它将是 4 月 1 日。注意:我不想硬编码日期,因为我希望它随着时间的变化而灵活。请指教。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2020-09-02
    相关资源
    最近更新 更多