背景:今天新来得业务爸爸去查数看到日期是‘20220922’格式难受了,问我有没有法子转换成带日期‘-’形式,即‘2022-09-22’。
涉及的函数:
错误思路:我寻思这不挺简单的吗?直接给你安排上 to_date 不就完事儿了。
select to_date('20220922,yyyy-mm-dd');
result
+----+
| c0 |
+----+
|null|
+----+
so好像在HQL这条路是行不通的。
于是就找了下HQL的时间函数发现这两兄弟
unix_timestamp
语法:
unix_timestamp([expr [, fmt] ] )
返回当前时间或指定时间的 UNIX 时间戳。
expr
:采用有效日期/时间格式的可选日期、时间戳或字符串表达式。fmt
:在expr
为字符串时,指定格式的可选字符串表达式。
from_unixtime
语法:
from_unixtime(unixTime [, fmt])
在 fmt
中返回 unixTime
。
unixTime
:BIGINT 表达式,表示自 1969-12-31 16:00:00 以来已经过去的秒数。fmt
:可选的具有有效格式的 STRING 表达式。
使用案例:
SELECT unix_timestamp('2022-09-22 07:07:07','yyyy-MM-dd HH:mm:ss') ;
SELECT unix_timestamp('2022/09/22 07:07:07','YYYY/MM/DD HH:mm:ss') ;
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
我是分割线
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
SELECT from_unixtime(2120212212,'yyyy-MM-dd HH:mm:ss');
SELECT from_unixtime(2120212212,'yyyy/MM/dd HH');
SELECT from_unixtime(2120212212,'yyyyMMdd ');
可以看到无论是 unix_timestamp 或者是 from_unixtime 只要符合日期格式的数据形式他们都能够互相转换的,格式有’YYYYMMDD‘,’YYYY/MM/DD‘,’yyyy-MM-dd‘,’yyyy-MM-dd HH:mm:ss'......十分强大
ps:Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time), 是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
所以
正确思路:将原有的日期格式转换成时间戳,再从时间戳转换成你想要的格式。
‘YYYYMMDD’====》》》‘YYYY-MM-DD’
SELECT from_unixtime(unix_timestamp('20220922','YYYYMMDD'),'YYYY-MM-DD') ;
result
+----------+
| c0 |
+----------+
|2022-09-22|
+----------+
总结:
-
unix_timestamp : 转换成时间戳,他是可以将符合时间格式转换成按秒计数的函数。例如:'YYYY-MM-DD','YYYYMMDD','YYYY/MM/DD',以及后面的时分秒。
-
from_unixtime : 时间戳转日期函数,就是将时间戳转成你想要的格式。