10

私の質問は: Oracle SQL関数のように、Hiveで月の最後の日を見つける方法はありますか? :

LAST_DAY(D_Dernier_Jour)

ありがとう。

4

6 に答える 6

4

以下のカスタム UDF を回避したい場合は、別の解決策があります。 to_date(date_sub(add_months(concat(from_unixtime(unix_timestamp('2015-07-28','yyyy-MM-dd'), 'yyyy-MM'),'-01'),1),1))

于 2015-10-21T19:29:23.143 に答える
0
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;
于 2015-10-21T09:16:01.240 に答える
-2

このUDFをHiveクエリto_date(string timestamp)で使用できると思います。たとえば、:-タイムスタンプ文字列の日付部分を返します: 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;

これがあなたの原因に役立つことを願っています

于 2013-07-09T14:41:12.577 に答える