10

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

LAST_DAY(D_Dernier_Jour)

谢谢。

4

6 回答 6

12

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

last_day(string date)

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

于 2017-05-02T07:18:06.640 回答
6

您可以使用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 构建和使用它的所有信息。

高温高压

于 2013-07-09T21:06:08.527 回答
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 回答
1

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

date_sub(concat(from_unixtime(unix_timestamp(), 'yyyy-MM'), '-01'), 1)
于 2015-03-25T15:17:23.033 回答
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

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

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

于 2013-07-09T14:41:12.577 回答