Hive 时间日期处理总结

Stella981
• 阅读 601
select
     day                                                                                                   -- 时间
    ,date_add(day,1 - dayofweek(day))                                                  as week_first_day   -- 本周第一天_周日
    ,date_add(day,7 - dayofweek(day))                                                  as week_last_day    -- 本周最后一天_周六
    ,date_add(day,1 - case when dayofweek(day) = 1 then 7 else dayofweek(day) - 1 end) as week_first_day   -- 本周第一天_周一
    ,date_add(day,7 - case when dayofweek(day) = 1 then 7 else dayofweek(day) - 1 end) as week_last_day    -- 本周最后一天_周日
    ,next_day(day,'TU')                                                                as next_tuesday     -- 当前日期的下个周二
    ,trunc(day,'MM')                                                                   as month_first_day  -- 当月第一天
    ,last_day(day)                                                                     as month_last_day   -- 当月最后一天
    ,to_date(concat(year(day),'-',lpad(ceil(month(day)/3) * 3 -2,2,0),'-01'))          as season_first_day -- 当季第一天
    ,last_day(to_date(concat(year(day),'-',lpad(ceil(month(day)/3) * 3,2,0),'-01')))   as season_last_day  -- 当季最后一天
    ,trunc(day,'YY')                                                                   as year_first_day   -- 当年第一天
    ,last_day(add_months(trunc(day,'YY'),12))                                          as year_last_day    -- 当年最后一天
    ,weekofyear(day)                                                                   as weekofyear       -- 当年第几周
    ,second(day)                                                                       as second           -- 秒钟
    ,minute(day)                                                                       as minute           -- 分钟
    ,hour(day)                                                                         as hour             -- 小时
    ,day(day)                                                                          as day              -- 日期
    ,month(day)                                                                        as month            -- 月份
    ,lpad(ceil(month(day)/3),2,0)                                                      as season           -- 季度
    ,year(day)                                                                         as year             -- 年份
from (
    select '2018-01-02 01:01:01' as day union all
    select '2018-02-02 02:03:04' as day union all
    select '2018-03-02 03:05:07' as day union all
    select '2018-04-02 04:07:10' as day union all
    select '2018-05-02 05:09:13' as day union all
    select '2018-06-02 06:11:16' as day union all
    select '2018-07-02 07:13:19' as day union all
    select '2018-08-02 08:15:22' as day union all
    select '2018-09-02 09:17:25' as day union all
    select '2018-10-02 10:19:28' as day union all
    select '2018-11-02 11:21:31' as day union all
    select '2018-12-02 12:23:34' as day
) t1
;

获取当前时间截:

1 select unix_timestamp() ;
2 +-------------+--+
3 |     _c0     |
4 +-------------+--+
5 | 1521684090  |
6 +-------------+--+

获取当前时间1:

1 select current_timestamp;
2 +--------------------------+--+
3 |           _c0            |
4 +--------------------------+--+
5 | 2018-03-22 10:04:02.568  |
6 +--------------------------+--+

获取当前时间2:

1 SELECT from_unixtime(unix_timestamp());
2 +----------------------+--+
3 |         _c0          |
4 +----------------------+--+
5 | 2018-03-22 10:04:38  |
6 +----------------------+--+

获取当前日期:

1 SELECT CURRENT_DATE;
2 +-------------+--+
3 |     _c0     |
4 +-------------+--+
5 | 2018-03-22  |
6 +-------------+--+

日期差值:datadiff(结束日期,开始日期),返回结束日期减去开始日期的天数。

1 select datediff(CURRENT_DATE,'2017-01-01') as datediff;
2 +-----------+--+
3 | datediff  |
4 +-----------+--+
5 | 445       |
6 +-----------+--+

日期加减:date_add(时间,增加天数),返回值为时间天+增加天的日期;date_sub(时间,减少天数),返回日期减少天后的日期。

1 select date_add(current_date,365) as dateadd;
2 +-------------+--+
3 |   dateadd   |
4 +-------------+--+
5 | 2019-03-22  |
6 +-------------+--+

时间差:两个日期之间的小时差

1 select (hour('2018-02-27 10:00:00')-hour('2018-02-25 12:00:00')+(datediff('2018-02-27 10:00:00','2018-02-25 12:00:00'))*24) as hour_subValue;
2 +----------------+--+
3 | hour_subValue  |
4 +----------------+--+
5 | 46             |
6 +----------------+--+

获取年、月、日、小时、分钟、秒、当年第几周

 1 select 
 2      year('2018-02-27 10:00:00')       as year
 3     ,month('2018-02-27 10:00:00')      as month
 4     ,day('2018-02-27 10:00:00')        as day
 5     ,hour('2018-02-27 10:00:00')       as hour
 6     ,minute('2018-02-27 10:00:00')     as minute
 7     ,second('2018-02-27 10:00:00')     as second
 8     ,weekofyear('2018-02-27 10:00:00') as weekofyear
 9 ; 
10 +-------+--------+------+-------+---------+---------+-------------+--+
11 | year  | month  | day  | hour  | minute  | second  | weekofyear  |
12 +-------+--------+------+-------+---------+---------+-------------+--+
13 | 2018  | 2      | 27   | 10    | 0       | 0       | 9           |
14 +-------+--------+------+-------+---------+---------+-------------+--+

转成日期:

1 select to_date('2018-02-27 10:03:01') ;
2 +-------------+--+
3 |     _c0     |
4 +-------------+--+
5 | 2018-02-27  |
6 +-------------+--+

当月最后一天:

1 select  last_day('2018-02-27 10:03:01');
2 +-------------+--+
3 |     _c0     |
4 +-------------+--+
5 | 2018-02-28  |
6 +-------------+--+

当月第一天:

1 select trunc(current_date,'MM') as day;
2 +-------------+--+
3 |     day     |
4 +-------------+--+
5 | 2018-03-01  |
6 +-------------+--+

当年第一天:

1 select trunc(current_date,'YY') as day;
2 +-------------+--+
3 |     day     |
4 +-------------+--+
5 | 2018-01-01  |
6 +-------------+--+

next_day返回当前时间的下一个星期几所对应的日期

1 select next_day('2018-02-27 10:03:01', 'TU');
2 +-------------+--+
3 |     _c0     |
4 +-------------+--+
5 | 2018-03-06  |
6 +-------------+--+

-- hive中怎么获取两个日期相减后的小时(精确到两位小数点),而且这两个日期有可能会出现一个日期有时分秒,一个日期没有时分秒的情况
select
     t3.day1
    ,t3.day2
    ,t3.day  -- 日期
    ,t3.hour -- 小时
    ,t3.min  -- 分钟
    ,t3.day + t3.hour          as hour_diff_1
    ,t3.day + t3.hour + t3.min as hour_diff_2
    ,round((cast(cast(t3.day1 as timestamp) as bigint) - cast(cast(t3.day2 as timestamp) as bigint)) / 3600,2) as hour_diff_3 -- 最优
    ,(datediff(t3.day1,t3.day2) * 24) + (nvl(hour(t3.day1),0) - nvl(hour(t3.day2),0)) + round((nvl(minute(t3.day1),0) - nvl(minute(t3.day2),0)) / 60,2) as hour_diff_4
from (
    select
         t2.day1
        ,t2.day2
        ,(datediff(t2.day1,t2.day2) * 24)                  as day  -- 日期
        ,(hour(t2.day1) - hour(t2.day2))                   as hour -- 小时
        ,round((minute(t2.day1) - minute(t2.day2)) / 60,2) as min  -- 分钟
    from (
        select
             cast(t1.day1 as timestamp) as day1
            ,cast(t1.day2 as timestamp) as day2
        from (
            select '2018-01-03 02:30:00' as day1, '2018-01-02 23:00:00' as day2 union all
            select '2018-06-02 08:15:22' as day1, '2018-06-02 06:11:16' as day2 union all
            select '2018-07-04'          as day1, '2018-07-02 01:01:01' as day2
        ) t1
    ) t2
) t3
;

+------------------------+------------------------+------+-------+--------+--------------+--------------+--------------+--------------+--+
|          day1          |          day2          | day  | hour  |  min   | hour_diff_1  | hour_diff_2  | hour_diff_3  | hour_diff_4  |
+------------------------+------------------------+------+-------+--------+--------------+--------------+--------------+--------------+--+
| 2018-07-04 00:00:00.0  | 2018-07-02 01:01:01.0  | 48   | -1    | -0.02  | 47           | 46.98        | 46.98        | 46.98        |
| 2018-01-03 02:30:00.0  | 2018-01-02 23:00:00.0  | 24   | -21   | 0.5    | 3            | 3.5          | 3.5          | 3.5          |
| 2018-06-02 08:15:22.0  | 2018-06-02 06:11:16.0  | 0    | 2     | 0.07   | 2            | 2.07         | 2.07         | 2.07         |
+------------------------+------------------------+------+-------+--------+--------------+--------------+--------------+--------------+--+

### 当周第一天,最后一天
date -d "2018-10-24 $(($(date -d 2018-10-24 +%u)-1)) days ago" +%Y-%m-%d
date -d "2018-10-24 $((7-$(date -d 2018-10-24 +%u))) days" +%Y-%m-%d
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这