查找Hive中的一个月的最后一天

时间:2013-07-09 12:48:49

标签: sql hive hiveql

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

LAST_DAY(D_Dernier_Jour)

感谢。

7 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

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

last_day(string date)

  

返回日期所属的当月的最后一天。 date是一个字符串格式为&y; yyyy-MM-dd HH:mm:ss'或者&#y; yyyy-MM-dd'日期的时间部分将被忽略。

答案 2 :(得分: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 :(得分:0)

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

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

答案 4 :(得分: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;

答案 5 :(得分:0)

https://github.com/manojkumarvohra/day-extremes

您可以使用此项目获取各种单位的第一天/最后一天:日,周,月,季,年。

它接受输入日期为字符串,时间戳,各种有效格式的日期以及各种有效格式的输出。

您可以选择将可选时间戳添加为间隔。

用法

FIRST_DAY_OF(unit,date,input_format [optional],output_format [optional],include_interval [optional],interval [optional])

LAST_DAY_OF(unit,date,input_format [optional],output_format [optional],include_interval [optional],interval [optional])

答案 6 :(得分:-2)

我认为您可以在Hive查询 to_date(字符串时间戳)中使用此UDF。例如: - 返回时间戳字符串的日期部分:to_date(“1970-01-01 00:00:00”)=“1970-01-01”。现在你需要写一个UDF说(即 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;

我希望这会有助于你的事业