【问题标题】:Find last day of a month in Hive在 Hive 中查找一个月的最后一天
【发布时间】:2013-07-07 01:56:26
【问题描述】:

我的问题是:有没有办法在 Hive 中找到一个月的最后一天,比如 Oracle SQL 函数? :

LAST_DAY(D_Dernier_Jour)

谢谢。

【问题讨论】:

    标签: sql hive hiveql


    【解决方案1】:

    从 Hive 1.1.0 开始,last_day(string date) 功能可用。

    last_day(string date)

    返回日期所属的一个月的最后一天。 date 是格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”的字符串。日期的时间部分被忽略。

    【讨论】:

      【解决方案2】:

      如果您想避免自定义 UDF,下面是另一种解决方案: to_date(date_sub(add_months(concat(from_unixtime(unix_timestamp('2015-07-28','yyyy-MM-dd'), 'yyyy-MM'),'-01'),1),1))

      【讨论】:

        【解决方案3】:
        select 
        CASE WHEN month(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')) IN(4,6,9,11)
        THEN
        date_add((FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')),30 - day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'))) 
        WHEN month(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')) IN(1,3,5,7,8,10,12)
        THEN 
        date_add((FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')),31 - day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'))) 
        WHEN month(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')) = 2 and day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'))=28
        THEN 
        date_add((FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')),28 - day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')))
        WHEN month(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')) = 2 and day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'))=29
        THEN 
        date_add((FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')),29 - day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')))
        END as calc_date from table_name
        limit 2;
        

        【讨论】:

          【解决方案4】:

          我认为您可以在 Hive 查询 to_date(string timestamp) 中使用此 UDF。例如:-返回时间戳字符串的日期部分:to_date("1970-01-01 00:00:00") = "1970-01-01"。现在您需要编写一个 UDF say(即 lastDay),它将实现以下内容:-

              Date today = new Date();  
          
              Calendar calendar = Calendar.getInstance();  
              calendar.setTime(today);  
          
              calendar.add(Calendar.MONTH, 1);  
              calendar.set(Calendar.DAY_OF_MONTH, 1);  
              calendar.add(Calendar.DATE, -1);  
          
              Date lastDayOfMonth = calendar.getTime();  
          
              DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
              return sdf.format(lastDayOfMonth)
          

          现在你的 UDF 将是这样的:-

          select lastDay(to_date(string timestamp)) from xxx;
          

          我希望这会对你的事业有所帮助

          【讨论】:

            【解决方案5】:

            像下面这样的东西可以给你一些灵感。该代码将为您提供上个月的最后一天。您可以采用它来获取您想要的任何一个月的最后一天。

            date_sub(concat(from_unixtime(unix_timestamp(), 'yyyy-MM'), '-01'), 1)
            

            【讨论】:

              【解决方案6】:

              您可以使用 Nexr 提供的last_day(dateString) UDF。它根据具有 yyyy-MM-dd HH:mm:ss 模式的日期字符串返回该月的最后一天。

              Example:
              SELECT last_day('2003-03-15 01:22:33') FROM src LIMIT 1;
              2003-03-31 00:00:00
              

              您需要从他们的Github Repository 中提取它并构建。他们的 wiki 页面包含有关如何使用 Hive 构建和使用它的所有信息。

              HTH

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-06-17
                • 1970-01-01
                • 2019-02-06
                • 2013-05-14
                • 1970-01-01
                • 2011-01-04
                相关资源
                最近更新 更多