oracle/mysql/hive日期时间格式转换及常用计算方法对比总结

因为笔者最近写sql徘徊在mysql、oracle、hive之中,有些函数容易搞混。因此在这里作个简单的总结,加深一下自己的印象,避免每次都要百度一下。

 

一、获取系统时间

 

 sql语句结果
oracle
select sysdate from dual;
mysql
select now(), sysdate(), current_date(), current_time(), current_timestamp();
hive
select current_date(), current_timestamp();

 

总结:

oracle里有1种方法:

1)sysdate关键字,注意这不是一个函数,因此不能加括号。返回的是完整日期时间格式。

mysql有5种方法:

1) now(),返回完整日期时间格式

2)也可以用sysdate(),但是mysql里的sysdate是函数,因此使用时需要加括号,返回完整日期时间格式。

3)current_date(),只返回日期

4)current_time(), 只返回时间

5)current_timestamp(),返回完整日期时间格式

hive有2种方法,且与mysql 相同:

1)current_date(),只返回日期

2)current_timestamp(),返回完整日期时间格式

 

二、时间格式转换

oracle时间格式转换函数主要是to_char(), to_date

mysql时间格式转换函数是date_formate(),str_to_date()

hive时间格式转换函数是from_unixtime(), unix_timestamp.

下表列出了oracle/mysql/hive的时间格式转化的相关函数。

 函数
oracle

to_char(日期,想要的格式),返回字符串,若要获取英文月份或星期名加上'nls_date_language=American'

to_date(字符串,字符串的格式),返回日期

mysql

date_format(日期/日期格式的字符串,想要的格式),返回字符串

str_to_date(字符串,字符串的格式),返回日期

hive

from_unixtime(unix时间戳,[想要的格式]),返回日期字符串,格式参数默认值yyyy-MM-dd HH:mm:ss

unix_timestamp(日期字符串, [字符串的格式]),返回unix时间戳。格式参数默认值yyyy-MM-dd HH:mm:ss

注意:hive日期都是字符串的类型('yyyy-MM-dd HH:mm:ss'),因此转换时要借助unix时间戳。如果要将一种日期字符串转换成另一种格式的日期字符串,需要用:

from_unixtime(unix_timestamp(日期字符串,该日期的格式),  想要的格式)。

 oracle,mysql,hive的格式支持类型见下表:

 oracle mysql hive
yyyy四位年, 2019%Y四位年, 2019yyyy
 yyy三位年, 019   
 yy二位年, 19%y二位年, 19 
mm两位月, 11%m (%c)两位月,11MM
 mon简写月份, 11月(中)nov(英)%b简写月份,Nov 
 month全写月份,11月(中) november(英)%M月名,November 
dd当月第几天,28

%d

%D

当月第几天,28

有英语后缀的日期(1st, 2nd, 3rd...),28th

dd
 ddd当年第几天,332%j年的天 (001-366),332 
星期dy星期缩写,星期四(中) thu(英)%a缩写的星期名字(Sun……Sat) ,Thu 
 day星期全写,星期四(中) thursday(英)

%W

%w

星期全写,Thursday

周的第几天(0=星期日, 6=星期六),4

 
hh24两位24小时制,17%H两位24小时制00-23,17HH
 hh两位12小时制,05

%h

%I

两位12小时制01-12,05hh
   %k非2位24小时制0~23,17 
   %l 非2位12小时制1~12,5 
mi两位60进制,23%i分钟,数值(00-59),23mm
ss两位60进制,19%S %s秒(00-59),19ss
   %pAM 或 PM 
   

%T

%r

时间,24 小时(hh:mm:ss) 

时间,12 小时(hh:mm:ss [AP]M) 

 
季度q一位,当年第几季度,4   
年的周ww两位,当年第几周,48

%U

%u

周 (00-53) 星期日是一周的第一天

周 (00-53) 星期一是一周的第一天

 
月的周w一位,当月第几周,4   
      

 

三、获取年/月/日/时/分/秒/星期/周/季度

获取年/月/日/时/分/秒/周/季度,有两种方法:

1)通过上面所讲的格式转换方法,指定相应的格式。

2)用sql自带函数提取:extract(要提取的单位 from 日期)。不过只支持提取年/月/日。

 oracle  mysqlhive
oracle

to_char(日期,要提取的单位格式)

extract(要提取的单位 from 日期),只支持day/month/year

  day(日期) 
mysql

date_format(日期, 要提取的单位格式)

day(日期)

month(日期)

year(日期)

time(日期)

week(日期) weekofyear(日期)

weekofmonth(日期)

quarter(日期)

  month(日期) 
hive

from_unixtime(unix_timestamp(日期字符串), 要提取的单位格式)

day(日期字符串)

month(日期字符串)

year(日期字符串)

hour(日期字符串)

minute(日期字符串)

second(日期字符串)

weekofyea(日期字符串)

  month(日期) 
      
      
      
      
 oraclemysqlhive

to_char(日期,'dd')

extract (day from 日期)

date_format(日期, %d)

day(日期)

from_unixtime(unix_timestamp(日期字符串), 'dd')

date_format(日期字符串, 'dd')

day(日期字符串)

to_char(日期,'mm')

extract(month from 日期)

date_format(日期, %m)

month(日期)

from_unixtime(unix_timestamp(日期字符串), 'MM')

date_format(日期字符串, 'MM')

month(日期字符串)

to_char(日期,'yyyy')

extract(year from 日期)

date_format(日期, %Y)

year(日期)

from_unixtime(unix_timestamp(日期字符串), 'yyyy')

date_format(日期字符串, 'yyyy')

year(日期字符串)

to_char(日期,'hh24')

date_format(日期, %H)

from_unixtime(unix_timestamp(日期字符串), 'HH')

date_format(日期字符串, 'HH')

hour(日期字符串)

to_char(日期,'mi')

date_format(日期, %i)

from_unixtime(unix_timestamp(日期字符串), 'mm')

date_format(日期字符串, 'mm')

minute(日期字符串)

to_char(日期,'ss')

date_format(日期, %s)

from_unixtime(unix_timestamp(日期字符串), 'ss')

date_format(日期字符串, 'ss')

second(日期字符串)

星期

to_char(日期,'day')

date_format(日期, %W)

 

 

年的周to_char(日期,'ww')

date_format(日期, %U)

weekofyear(日期),week(日期), yearweek(日期)

weekofyear(日期)

月的周to_char(日期,'w')

weekofmonth(日期)

 

季度

to_char(日期,'q')

quarter(日期)

 
 oracle sql结果
select to_char(to_date('2019-11-22 14:02:36'), 'dd') from dual; -- 方法1
select extract(day from to_date('2019-11-22 14:02:36')) from dual; -- 方法2
22
select to_char(to_date('2019-11-22 14:02:36'), 'mm') from dual; -- 方法1
select extract(month from to_date('2019-11-22 14:02:36')) from dual; -- 方法2

 

11

select to_char(to_date('2019-11-22 14:02:36'), 'dddd') from dual;-- 方法1
select extract(year from to_date('2019-11-22 14:02:36')) from dual;-- 方法2

 

2019

select to_char(to_date('2019-11-22 14:02:36'), 'hh24') from dual;-- 方法1
14

select to_char(to_date('2019-11-22 14:02:36'), 'mi') from dual;-- 方法1
02

select to_char(to_date('2019-11-22 14:02:36'), 'ss') from dual;-- 方法1
36

星期

select to_char(to_date('2019-11-22 14:02:36'), 'day') from dual;-- 方法1
星期五
年的周
select to_char(to_date('2019-11-22 14:02:36'), 'ww') from dual;-- 方法1
47
月的周
select to_char(to_date('2019-11-22 14:02:36'), 'w') from dual;-- 方法1
4

季度

select to_char(to_date('2019-11-22 14:02:36'), 'q') from dual;-- 方法1
4

 

 

 

 

 

 

四、求时间间隔

求时间间隔可分为两种:

1)精确时间间隔:例如计算年龄时的周岁,不满一年的需要舍去。

2)虚时间间隔:我暂且按照虚岁的概念来叫这种入位时间隔叫虚时间间隔。

3.1 精确时间间隔

oracle: 直接日期相减,得到两个日期的间隔天数(非整型)。实际是两个日期的间隔秒数/86400。

 oracle 
天数floor((date2-date1)) 
月份数 

 

年数

  

周数

  

季度数

  

小时数

  

分钟数

  

秒数

  

 

  

 

 oraclemysql
天数to_number(date1-date2)datediff(date1,date2)
月份数 

timestampdiff(freq, date1, date2)

freq=

{FRAC_SECOND,

SECOND,

MINUTE,

HOUR,

DAY,

WEEK,

MONTH,

QUARTER,

YEAR}

年数

  

周数

  

季度数

  

小时数

  

分钟数

  

秒数

  

 

  

 

 oraclemysql
天数to_number(date2-date1)datediff(date1,date2)
月份数 

timestampdiff(freq, date1, date2)

freq=

{FRAC_SECOND,

SECOND,

MINUTE,

HOUR,

DAY,

WEEK,

MONTH,

QUARTER,

YEAR}

年数

  

周数

  

季度数

  

小时数

  

分钟数

  

秒数

  

 

  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值