我的问题是:有没有办法在 Hive 中找到一个月的最后一天,比如 Oracle SQL 函数?:
LAST_DAY(D_Dernier_Jour)
谢谢。
从 Hive 1.1.0 开始,last_day(string date)
功能可用。
last_day(string date)
返回日期所属月份的最后一天。date 是格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”的字符串。日期的时间部分被忽略。
您可以使用last_day(dateString)
Nexr 提供的 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 存储库中提取它并构建。他们的 wiki 页面包含有关如何使用 Hive 构建和使用它的所有信息。
高温高压
如果您想避免下面的自定义 UDF 是另一种解决方案:
to_date(date_sub(add_months(concat(from_unixtime(unix_timestamp('2015-07-28','yyyy-MM-dd'), 'yyyy-MM'),'-01'),1),1))
像下面这样的东西可以给你一些灵感。该代码将为您提供上个月的最后一天。您可以采用它来获得您想要的任何一个月的最后一天。
date_sub(concat(from_unixtime(unix_timestamp(), 'yyyy-MM'), '-01'), 1)
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;
我认为您可以在 Hive 查询to_date(string timestamp)中使用此 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;
我希望这对您的事业有所帮助