我的问题是:有没有办法在Hive中找到一个月的最后一天,比如Oracle SQL函数? :
LAST_DAY(D_Dernier_Jour)
感谢。
答案 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;
我希望这会有助于你的事业