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

Posted

技术标签:

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

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

LAST_DAY(D_Dernier_Jour)

谢谢。

【问题讨论】:

【参考方案1】:

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

last_day(string date)

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

【讨论】:

【参考方案2】:

您可以使用 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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:
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;

【讨论】:

【参考方案6】:

我认为您可以在 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;

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

【讨论】:

以上是关于在 Hive 中查找一个月的最后一天的主要内容,如果未能解决你的问题,请参考以下文章

我如何获得一个月的最后一天?

SQL 查询以查找该月的最后一天

用SQL取每个月的最后一天,怎么写

linux的周期计划任务在每个月的最后一天执行 该怎么写

excel中怎么使用函式计算某个月的最后一天日期

python怎么获得每个月的第一天和最后一天