图解HIVE时间和日期and类型转换

Posted 小基基o_O

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图解HIVE时间和日期and类型转换相关的知识,希望对你有一定的参考价值。

文章目录

类型转换图

TIMESTAMP

现在

SELECT CURRENT_TIMESTAMP();

DATE

今天

SELECT CURRENT_DATE();

昨天

SELECT DATE_SUB(CURRENT_DATE(),1);
-- 或
SELECT DATE_ADD(CURRENT_DATE(),-1);

TIMESTAMP => DATE

SELECT TO_DATE(CURRENT_TIMESTAMP());

秒数(Unix时间戳

  • Unix时间戳,外文名Unix timestamp
    从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑 闰秒
  • 数据类型:bigint
-- 现在的秒数
SELECT UNIX_TIMESTAMP();

毫秒 => TIMESTAMP(注意时区问题)

-- 可能会有时区问题
SELECT FROM_UTC_TIMESTAMP(0L,'UTC+8');

字符串

  • 数据类型:string
  • Unix时间戳转字符串时,注意时区问题

TIMESTAMP => 字符串

SELECT DATE_FORMAT(CURRENT_TIMESTAMP(),'yyyy-MM-dd HH:mm:ss');

字符串 => TIMESTAMP

SELECT CAST('2022-04-07 19:41:37' AS TIMESTAMP);

DATE => 字符串

SELECT DATE_FORMAT(CURRENT_DATE(),'yyyy-MM-dd');

字符串 => DATE

SELECT TO_DATE('2022-04-07 19:41:37');
-- 2022-04-07

字符串 => 秒数(注意时区问题,慎用)

SELECT UNIX_TIMESTAMP('1970-01-01 00:00:00');

秒数 => 字符串(注意时区问题)

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());
-- 可能会有时区问题
-- 解决时区问题
SELECT FROM_UNIXTIME(0+UNIX_TIMESTAMP('1970-01-01 00:00:00')+28800);
-- 1970-01-01 08:00:00

毫秒 => TIMESTAMP => STRING

-- 解决时区问题
SELECT
DATE_FORMAT(
FROM_UTC_TIMESTAMP((UNIX_TIMESTAMP('1970-01-01 00:00:00')*1000)+0L,'GMT+8'),'yyyy-MM-dd HH:mm:ss'
);

补充

1、CAST 可用于类型转换

SELECT
CAST('12' AS INT),
CAST('1.2' AS FLOAT);

2、to_date 解析结果为 NULL

2021/11/11会解析成NULL,坑在于/

SELECT to_date('2021/11/11');

3、年月中的月不是两个字符

CONCAT(YEAR('2021-09-01'),'-',MONTH('2021-09-01'))

得到2021-9而不是2021-09,排序时会乱,对此可用下面2种

DATE_FORMAT(TO_DATE('2021-09-01'),'yyyy-MM')
-- 或
SUBSTR('2021-09-01',0,7)

以上是关于图解HIVE时间和日期and类型转换的主要内容,如果未能解决你的问题,请参考以下文章

UDF 在 Hive 中转换日期格式

hive将时间转换成星期几

Hive函数用法:Cast(字段名 as 转换的类型 )

在 Hive 中将字符串转换为日期/时间戳

Hive日期格式转换详解(包含13位时间戳转毫秒时间)

HIVE 以及地点和日期声明