【数据库笔记】Oracle & MySQL 日期时间数据类型、日期函数和转换函数の对比(续更)


1 Oracle & MySQL 日期时间数据类型

1.1 Oracle 日期时间数据类型

数据类型字节数取值范围日期格式零值
DATE7 (包含 世纪、年、月、日、时、分、秒。占用7个字节bai,上面每个部分1个字节)-4712-01-01 00:00:00 ~ 9999-12-31 23:59:59yyyyMMdd hh24:mi:ss0000-00-00 00:00:00
TIMESTAMP7/11 (如果精度为0,则用7字节存储,与date类型功能相同,如果精度大于0则用11字节存储)-4712-01-01 00:00:00 ~ 9999-12-31 23:59:59.999999yyyyMMdd hh24:mi:ss.ff6 (不仅可以保存日期和时间,还能保存小数秒,小数位数可以指定为0-9,默认为6位)0000-00-00 00:00:00.000000

1.2 MySQL 日期时间数据类型

数据类型字节数取值范围日期格式零值
YEAR11901~2155YYYY0000
DATE31000-01-01~9999-12-3YYYY-MM-DD0000-00-00
TIME3-838:59:59~838:59:59HH:MM:SS00:00:00
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00
TIMESTAMP41970-01-01 00:00:01~2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00

Reference:https://blog.csdn.net/weixin_42315600/article/details/88412976

2 Oracle 日期函数和转换函数

2.1 日期函数

日期函数用于处理 date类型 的数据,两个日期 相减 返回日期之间相差的天数。日期不允许做加法运算,无意义。

  • 常见代表符号:yyyy 年,mm 月,dd 日,hh 小时,mi 分钟,ss 秒,day 星期几
  • 默认情况:日期格式是dd-mon-yy(日-月-年)

表:Oracle 常见的日期函数

序号函数意义示例结果
1sysdate该函数返回系统时间select sysdate from dual;2013-01-06
2months_between(m,n)日期m和日期n相差多少月数select months_between(to_date(‘2018-10-9’,‘yyyy-mm-dd’),to_date(‘2017-10-09’,‘yyyy-mm-dd’)) m from dual;12
select months_between(to_date(‘2017-10-9’,‘yyyy-mm-dd’),to_date(‘2018-10-09’,‘yyyy-mm-dd’)) m from dual;-12
3add_months(d,n)在日期d上增加n个月数select add_months(sysdate,2) from dual;2012-5-16 下午 02:30:47
select add_months(sysdate,-2) from dual;2011-11-16 下午 02:32:39
4next_day(d, ‘星期一’)指定日期d下一个星期一对应的日期select next_day(sysdate, 'MONDAY ') FROM DUAL;2018/2/17
select next_day(sysdate,‘MON’) FROM DUAL;2018/2/17
5last_day(d)返回指定日期d所在月份的最后一天select last_day(SYSDATE) FROM dual;2018/2/28
6extract(month from d)从日期d上截取年、月、日、时、分、秒select extract (year from sysdate) year, extract (month from sysdate) month, extract (day from sysdate) day from dual;
7round(d,time)日期的四舍五入select sysdate,round(sysdate,‘year’) from dual;2017-09-13 16:11:13,2018-01-01 00:00:00
8trunc(d,time)日期的截断select sysdate,trunc(sysdate) from dual2013-01-06,2013-01-06

补充说明

  • 序号1:格式化输出
    ①select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss’) now from dual;=》 2020-10-09 01:50:54
    ②alter session set nls_date_format=‘yyyy-mm-dd hh24:mi:ss’; select sysdate from dual;=》 2020-10-09 01:50:54
  • 序号7:ROUND(d[,fmt])
    ① 日期
    【功能】返回一个以fmt为格式的四舍五入日期值
    【参数】d是日期,fmt是格式 模型。默认fmt为DDD,即月中的某一天。
    如果fmt为“YEAR”,舍入到某年的1月1日,即前半年舍去,后半年作为下 一年
    如果fmt为“MONTH”,舍入到某月的1日,即前月舍去,后半月作为下一 月
    默认为“DDD”,即月中的某一天,最靠近的天,前半天舍去,后半天作为第二天
    如果fmt为“DAY”,舍入到最近的周的周日,即上半周舍去,下半周作为下 一周周日
    【返回】日期
    ② 数字
--日期
sql>select sysdate,round(sysdate),round(sysdate,'ddd'),
round(sysdate,'day'),round(sysdate,'month'),round(sysdate,'year') from dual; 

>2017-09-13 16:11:13 , 2017-09-14 00:00:00 , 2017-09-14 00:00:00 , 2017-09-17 00:00:00 , 
>2017-09-01 00:00:00 , 2018-01-01 00:00:00

--数字
select round(1234.5678,4) from dual;--1234.5678
select round(1234.5678,3) from dual;--1234.568
select round(1234.5678,2) from dual;--1234.57
select round(1234.5678,1) from dual;--1234.6
select round(1234.5678,0from dual;--1235
select round(1234.5678,-1) from dual;--1230
select round(1234.5678,-2) from dual;--1200
select round(1234.5678,-3) from dual;--1000
select round(45.923,-1) from dual;--50

Reference:https://blog.csdn.net/weixin_44563573/article/details/89525979

  • 序号8:trunc()
    ① 日期
    ② 数字
    TRUNC(number,num_digits)
    Number 需要截尾取整的数字。
    Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0。
    TRUNC()函数截取时不进行四舍五入
--日期
select trunc(sysdate) from dual --2013-01-06 今天的日期为2013-01-06
select trunc(sysdate, 'mm') from dual --2013-01-01 返回当月第一天.
select trunc(sysdate,'yy') from dual --2013-01-01 返回当年第一天
select trunc(sysdate,'dd') from dual --2013-01-06 返回当前年月日
select trunc(sysdate,'yyyy') from dual --2013-01-01 返回当年第一天
select trunc(sysdate,'d') from dual --2013-01-06 (星期天)返回当前星期的第一天
select trunc(sysdate, 'hh') from dual --2013-01-06 17:00:00 当前时间为17:35 
select trunc(sysdate, 'mi') from dual --2013-01-06 17:35:00 TRUNC()函数没有秒的精确
--数字
select trunc(123.458) from dual --123
select trunc(123.458,0) from dual --123
select trunc(123.458,1) from dual --123.4
select trunc(123.458,-1) from dual --120
select trunc(123.458,-4) from dual --0
select trunc(123.458,4) from dual --123.458
select trunc(123) from dual --123
select trunc(123,1) from dual --123
select trunc(123,-1) from dual --120
  • 关于Oracle中的dual表
    dual是Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中。以下几点我们需要明确:
  1. dual不是缩写词而是完整的单词。dual名词意思是对数,做形容词时是指二重的,二元的。
  2. Oracle中的dual表是一个单行单列的虚拟表。
  3. dual表是Oracle与数据字典一起自动创建的一个表,这个表只有1列DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据’X’, Oracle有内部逻辑保证dual表中永远只有一条数据。
  4. dual表主要用来选择系统变量或求一个表达式的值。
  5. Oracle的SELECT语法的限制为 SELECT * | [column1 [AS alias1], column2 [AS alias2]] FROM table。所以没有表名就没有办法查询,而时间日期并不存放在任何表中,于是这个dual虚拟表的概念就被引入了。最常见的一个简单的例子:SELECT sysdate FROM daul。

Reference:
https://blog.csdn.net/weixin_44563573/article/details/89525979
https://blog.csdn.net/tayanxunhua/article/details/9258029
https://www.cnblogs.com/zhangxiaoxia/p/10270840.html
https://blog.csdn.net/u012187452/article/details/79120771

2.2 转换函数

转换函数用于 将数据类型从一种转为另外一种 。在某些情况下,Oracle Server允许值的数据类型和实际的不一样,这时oracle server会隐含的转化数据类型,但是它并不适应所有的情况,为了提高程序的可靠性,我们应该使用转换函数进行转换。

表:Oracle 常见的转换函数

序号函数意义示例结果备注
1to_char(date,‘format’)将日期转换成字符串select to_char(sysdate, ‘yyyy/mm/dd’) from dual;‘2003/07/09’1、必须包含在单引号中而且大小写敏感;
2、可以包含任意的有效的日期格式;
3、日期之间用逗号隔开。
2to_date(string,‘format’)将字符串转换成日期select to_date(‘2015-03-18 13:13:13’,‘yyyy-mm-dd hh24:mi:ss’) from dual;2015-03-18 13:13:13
3to_number(char,‘format’)将字符串转换为数值型select to_number(’RMB234234.4350′,’L999999.0000′) from dual;234234.435使用to_number(),一定要确保所转换字段是可转换为数字的。
如“2015-10-08”不可以,会报“invalid number”的错。

补充说明

  • 序号1:to_char(date,‘format’)
    ① 日期
    yy:两位数字的年份2004–>04
    yyyy:四位数字的年份 2004年
    mm:两位数字的月份 8月–>08
    dd:两位数字的天 30号–>30
    hh24: 8点–>20
    hh12:8点–>08
    mi、ss:显示分钟/秒
    ② 数字
    9:显示数字,并忽略前面0
    0:显示数字,如位数不足,则用0补齐
    .:(小数点)在指定位置显示小数点
    ,:(千位符)在指定位置显示逗号
    $:(美元符)在数字前加美元
    L:(本地货币符)在数字前面加本地货币符号
    C:(国际货币符)在数字前面加国际货币符号
    显示薪水的时候,把本地货币单位加在前面
--日期
select to_char(sysdate, 'yyyy/mm/dd') from dual;--'2003/07/09'
select to_char(sysdate, 'Month DD, YYYY') from dual;--'July 09, 2003'
select to_char(sysdate, 'FMMonth DD, YYYY') from dual;--'July 9, 2003'
select to_char(sysdate, 'MON DDth, YYYY') from dual;--'JUL 09TH, 2003'
select to_char(sysdate, 'FMMON DDth, YYYY') from dual;--'JUL 9TH, 2003'
select to_char(sysdate, 'FMMon ddth, YYYY') from dual;--'Jul 9th, 2003'

--数字
select to_char(1210.73, '9999.9') from dual;--'1210.7'
select to_char(1210.73, '9,999.99') from dual;--'1,210.73'
select to_char(1210.73, '$9,999.00') from dual;--'$1,210.73'
select to_char(21, '000099') from dual;--'000021'

Reference:https://blog.csdn.net/weixin_44563573/article/details/89525979

3 MySQL 日期函数和转换函数

Mysql作为一款开元的免费关系型数据库,用户基础非常庞大,本文列出了MYSQL常用日期函数与日期转换格式化函数。

3.1 日期函数

表:MySQL 常见的时间日期函数(date)

序号函数意义示例结果备注
1DAYOFWEEK(date)返回日期date是星期几SELECT DAYOFWEEK(‘2020-10-09’);
SELECT DAYOFWEEK(‘2020-10-09 00:00:00’)
7星期天=1,星期一=2, … 星期六=7
2WEEKDAY(date)返回date是在一周中的序号SELECT WEEKDAY(‘2020-10-09’) ;
SELECT WEEKDAY(‘2020-10-09 00:00:00’)
4星期天=6,星期一=0, … 星期六=5
3DAYOFMONTH(date)返回date是当月的第几天SELECT DAYOFMONTH(‘2020-10-09’) ;
SELECT DAYOFMONTH(‘2020-10-09 00:00:00’)
91号就返回1,… ,31号就返回31
4DAYOFYEAR(date)返回date是当年的第几天SELECT DAYOFYEAR(‘2020-10-09’) ;
SELECT DAYOFYEAR(‘2020-10-09 00:00:00’)
28301.01返回1,… ,12.31就返回365
5DAYNAME(date)返回date是周几的英文全称名字SELECT DAYNAME(‘2020-10-09’) ;
SELECT DAYNAME(‘2020-10-09 00:00:00’)
FridayMONTHNAME(date):返回date的是当年第几月的英文名字;
QUARTER(date):返回date的是当年的第几个季度,返回1,2,3,4
6WEEK(date,index)返回date在一年当中的第几周SELECT WEEK(‘2020-10-09’),WEEK(‘2020-10-09 00:00:00’,0),WEEK(‘2020-10-09 00:00:00’,1)40,40,41YEAR(date):返回date的4位数年份;
YEARWEEK(date):获取日期的年和周;
WEEKOFYEAR(date):获取当日是当年的第几周
7TO_DAYS(date)返回西元0年至日期date是总共多少天SELECT TO_DAYS(‘2020-10-09’) ,TO_DAYS(‘20201009’) ,TO_DAYS(‘201009’)738072,738072,738072
8FROM_DAYS(date)返回西元0年至今多少天的DATE值SELECT FROM_DAYS(738072)2020-10-09
9CURDATE()返回系统当前日期SELECT CURDATE(),CURRENT_DATE()2020-10-09,2020-10-09
10UNIX_TIMESTAMP(date)返回时间戳SELECT UNIX_TIMESTAMP(),UNIX_TIMESTAMP(‘2016-01-16’) ,UNIX_TIMESTAMP(‘2016-01-16 23:59:59’)1602247989,1452873600,1452959999时间戳是使用数字签名技术产生的数据,签名的对象包括了原始文件信息、签名参数、签名时间等信息。
11FROM_UNIXTIME(unix_timestamp,format)把时间戳转化成日期时间SELECT FROM_UNIXTIME(1452959999),FROM_UNIXTIME(1452959999,’%Y-%m-%d %H:%i:%s’)2016-01-16 23:59:59,2016-01-16 23:59:59
12LAST_DAY(date )获取date当月最后一天的日期SELECT LAST_DAY(SYSDATE()),LAST_DAY(‘2020-10-09’),LAST_DAY(‘2020-10-09 00:22:33’)2020-10-31,2020-10-31,2020-10-31
13MAKEDATE(year ,dayofyear )根据参数(年份,第多少天)获取日期SELECT MAKEDATE(2015 ,32)2015-02-01
14MAKETIME(hour ,minute ,second )根据参数(时,分,秒)获取时间SELECT MAKETIME(12 ,23 ,34 )12:23:34

表:MySQL 常见的时间日期函数(time)

序号函数意义示例结果备注
1HOUR(time)返回该date或者time的hour值,值范围(0-23)SELECT HOUR(‘11:20:18’),HOUR(‘2020-10-09 11:20:18’)11MINUTE(time):返回该time的minute值,值范围(0-59);SECOND(time):返回该time的minute值,值范围(0-59)
2PERIOD_ADD(month,add)返回对month做增减的操作结果SELECT PERIOD_ADD(2010,2),PERIOD_ADD(202010,3),PERIOD_ADD(202010,-3)202012,202101, 202007month的格式为yyMM或者yyyyMM,返回的都是yyyyMM格式的结果,add可以传负值
3PERIOD_DIFF(monthStart,monthEnd)返回monthStart - monthEnd的间隔月数SELECT PERIOD_DIFF(2010,2009),PERIOD_DIFF(2009,2010),PERIOD_DIFF(202010,2009)1,-1,1
4DATE_ADD(date,INTERVAL number type),同 ADDDATE()返回时间日期加减SELECT DATE_ADD(‘2015-12-31 23:59:59’,INTERVAL 1 SECOND) ;
SELECT DATE_ADD(‘2015-12-31 23:59:59’,INTERVAL 1 DAY) ;
SELECT DATE_ADD(‘2015-12-31 23:59:59’,INTERVAL ‘1:1’ MINUTE_SECOND) ;
SELECT DATE_ADD(‘2016-01-01 00:00:00’,INTERVAL ‘-1 10’ DAY_HOUR);
-> 2016-01-01 00:00:00-> 2016-01-01 23:59:59-> 2016-01-01 00:01:00-> 2015-12-30 14:00:00DATE_ADD()和ADDDATE()返回对date操作的结果;DATE_SUB(date,INTERVAL number type),同 SUBDATE()
5CURTIME()返回系统当前时间SELECT CURTIME(),CURRENT_TIME()20:49:06,20:49:06
6NOW(),SYSDATE(),CURRENT_TIMESTAMP(),LOCALTIME()返回系统当前日期和时间SELECT NOW(),SYSDATE(),CURRENT_TIMESTAMP(),CURRENT_TIMESTAMP,LOCALTIME(),LOCALTIME2020-10-09 20:51:37
7SEC_TO_TIME(seconds)把秒数转化成时间SELECT SEC_TO_TIME(2378)00:39:38TIME_TO_SEC(time):把时间转化成秒数
8ADDTIME(time,times)把times加到time上SELECT ADDTIME(“2015-12-31 23:59:59”,‘01:01:01’)2016-01-01 01:01:00
9DATEDIFF(date1,date2)返回date1-date2SELECT DATEDIFF( 2019/10/10, 2020/10/10)-365
10TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)返回datetime_expr2- datetime_expr1SELECT TIMESTAMPDIFF( SECOND,2019/10/10, 2020/10/10)31536000

补充说明

  • 序号4:DATE_ADD(date,INTERVAL number type)
    date格式可以是“15-12-31”,可以是“15-12-31 23:59:59”,也可以是“2015-12-31 23:59:59”,如果参数date是date格式,则返回date格式结果,如果参数date是datetime格式,则返回datetime格式结果
    type格式
    秒:SECOND
    分钟:MINUTE
    时间:HOUR
    天: DAY
    月: MONTH
    年: YEAR
    分钟和秒:MINUTE_SECOND
    小时和分钟:HOUR_MINUTE
    天和小时:DAY_HOUR
    年和月:YEAR_MONTH
    小时, 分钟:HOUR_SECOND
    天, 小时, 分钟:DAY_MINUTE
    天, 小时, 分钟, 秒:DAY_SECOND
    其他格式:如果不用函数,也可以考虑用操作符“+”,“-”
SELECT '2016-01-01' - INTERVAL 1 SECOND;
SELECT '2016-01-01' - INTERVAL 1 DAY; 
SELECT '2016-12-31 23:59:59' + INTERVAL 1 SECOND; 
SELECT '2016-12-31 23:59:59' + INTERVAL '1:1' MINUTE_SECOND;

-> 2015-12-31 23:59:59
-> 2015-12-31
-> 2017-01-01 00:00:00
-> 2017-01-01 00:01:00
  • 序号9/10:MySQL 计算时间差函数DATEDIFF & TIMESTAMPDIFF
    DATEDIFF(date1,date2)
    date1 和 date2 参数是合法的日期或日期/时间表达式。
    注释:只有值的日期部分参与计算。
    TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)
    返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差。其结果的
    单位由interval参数给出。interval 的法定值同TIMESTAMPADD()函数说明中所列出的相同。
    interval可以是:
    秒:SECOND
    分钟:MINUTE
    时间:HOUR
    天:DAY
    月:MONTH
    年:YEAR
SELECT
	datediff( from_date, to_date ),
	datediff( to_date, from_date ),
	TIMESTAMPDIFF( DAY, from_date, to_date ),
	TIMESTAMPDIFF( DAY, to_date, from_date ) ,
	TIMESTAMPDIFF(SECOND ,from_date,to_date)
FROM
	salaries 
	LIMIT 1

-> -365	365	365	-365	31536000

3.2 转换函数

表:MySQL 常见的转换函数

序号函数意义示例结果备注
1DATE_FORMAT(date,format)根据参数对date进行格式化SELECT DATE_FORMAT(‘2020-10-09 22:23:59’,’%W %M %Y’)Friday October 2020
2STR_TO_DATE(date,format )将字符串转成format格式的日期时间SELECT STR_TO_DATE(‘2015-01-01’, ‘%Y-%m-%d’)2015-01-01
3CONVERT_TZ(date,from_tz ,to_tz )转换时区SELECT CONVERT_TZ(‘2004-01-01 12:00:00’,’+00:00’,’+10:00’)2004-01-01 22:00:00

补充说明

  • 序号1: DATE_FORMAT(date,format)
SELECT DATE_FORMAT('2020-10-09 22:23:59','%W %M %Y') ;
SELECT DATE_FORMAT('2020-10-09 22:23:59','%D %y %a %d %m %b %j') ;
SELECT DATE_FORMAT('2020-10-09 22:23:59','%H %k %I %r %T %S %w') ;
SELECT DATE_FORMAT('2020-10-09 22:23:59','%Y-%m-%d %H:%i:%s');

-> Saturday January 2016
-> 9th 20 Fri 09 10 Oct 283
-> 22 22 10 10:23:59 PM 22:23:59 59 5
-> 2020-10-09 22:23:59;

format的格式都列出来:

%M 月名字(January……December) 
%W 星期名字(Sunday……Saturday) 
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) 
%Y 年, 数字, 4 位 
%y 年, 数字, 2 位 
%a 缩写的星期名字(Sun……Sat) 
%d 月份中的天数, 数字(00……31) 
%e 月份中的天数, 数字(0……31) 
%m 月, 数字(01……12) 
%c 月, 数字(1……12) 
%b 缩写的月份名字(Jan……Dec) 
%j 一年中的天数(001……366) 
%H 小时(00……23) 
%k 小时(0……23) 
%h 小时(01……12) 
%I 小时(01……12) 
%l 小时(1……12) 
%i 分钟, 数字(00……59) 
%r 时间,12 小时(hh:mm:ss [AP]M) 
%T 时间,24 小时(hh:mm:ss) 
%S 秒(00……59) 
%s 秒(00……59) 
%p AM或PM 
%w 一个星期中的天数(0=Sunday ……6=Saturday ) 
%U 星期(0……52), 这里星期天是星期的第一天 
%u 星期(0……52), 这里星期一是星期的第一天 
%% 字符% )

Reference:https://www.jb51.net/article/135803.htm

4 总结

温故而知新,与君共勉。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值