日期处理是一个比较繁琐的事情,通常可以针对具体问题百度和查询资料进行处理,所谓:具体问题,具体分析
SET @dt = '2019-06-24';--设定具体某一天时间
1.extract(属性 from date)从时间中截取固定属性的日期,可以直接运行下面代码,获取自己所需的逻辑
SELECT EXTRACT(YEAR FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(MONTH FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(DAY FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(HOUR FROM '2017-05-15 10:37:14.123456');
2.DATE_ADD(date,INTERVAL expr type) 从日期加上指定的时间间隔,这个主要用在截取时间判断上
-- type参数可参考:http://www.w3school.com.cn/sql/func_date_sub.asp
常用:YEAR,MONTH,DAY,HOUR,用来做时间切片
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 YEAR);-- 表示:2018-05-15 10:37:14.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 MONTH);-- 表示:2017-06-15 10:37:14.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 DAY);-- 表示:2017-05-16 10:37:14.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 HOUR);-- 表示:2017-05-15 11:37:14.123456
备注:YEAR,QUARTER,MONTH,WEEK,DAY,HOUR,MINUTE,SECOND,MICROSECOND, date_sub() 日期时间函数 和 date_add() 用法一致,并且可以用INTERNAL -1 xxx的形式互换使用;下同
3.DATE_SUB(date,INTERVAL expr type) 从日期减去指定的时间间隔
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 YEAR);-- 表示:2016-05-15 10:37:14.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 MONTH);-- 表示:2017-04-15 10:37:14.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 DAY);-- 表示:2017-05-14 10:37:14.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 HOUR);-- 表示:2017-05-15 09:37:14.123456
4.日期时间格式化 MySQL str_to_date (字符串转换为日期)函数:str_to_date(date, format)
SELECT STR_TO_DATE('06.05.2017 19:40:30', '%m.%d.%Y %H:%i:%s');-- 2017-06-05 19:40:30
5.日期时间格式化 MySQL 函数:DATE_FORMAT(date, format) ,根据format字符串格式化date值
SELECT DATE_FORMAT('2017-05-12 17:03:51', '%Y年%m月%d日 %H时%i分%s秒');-- 2017年05月12日 17时03分51秒(具体需要什么格式的数据根据实际情况来;小写h为12小时制;)
备注:STR_TO_DATE()和DATE_FORMATE()为互逆操作 ,time_format()只能用于时间的格式化
//下列修饰符可以被用在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), 这里星期一是星期的第一天
%% 一个文字“%”。
6.DATE(date, format) 将日期处理成我们需要的日期格式做判断
select date(sysdate()), date_format(now(), '%Y-%m-%d'),date_format(now(), '%Y/%m/%d'), sysdate();
1.在oracle中存储日期和时间是用Date类型
2.to_char()将时间值转为字符串
(1)to_char(x[,format]):用于将时间值x转换为字符串,其中format是可以用来规定x的时间格式
(2)年月日时分秒:yyyy-mm-dd hh24:mi:ss
3.to_date()将字符串转为时间值
(1)to_date(x[,format]]):将字符串x转换为时间值,可以使用format来规定x的格式,如果没有指定参数format,会采用数据库默认的格式dd-mon-yyyy或者dd-mon-yy
4.时间差 interval()
select sysdate,sysdate - interval '7' year from dual ---当前时间减7年
select sysdate,sysdate - interval '7' month from dual ---当前时间减7个月
select sysdate,sysdate - interval '7' day from dual ---当前时间减7天
5.两个日期间的天数
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;
备注:计算时间差,可以用来计算年龄和时长
4.相关的时间值函数
(1)add_months(x,y) 返回x加上y个月后的结果,如果y是负数,就从x中减去y个月
select * from table where created_time> =add_months(sysdate, -1) ##近1个月的相关信息
(2)last_day(x) 返回包含x的月份的最后一天
(3)months_between(x,y) 返回x和y之间有几个月。如果x在日历中比y晚,则返回值是正数;如果x在日历中比y早,则返回负数,否则返回0
(4)next_day(x,day) 返回从x开始,下一个day的时间值:day是一个文本字符串
(5)round(x[,unit])对x进行取整。默认情况下x取整为最近的一天,unit是一个可选的字符串参数,它指明要取整的单元
(6)trunc(x[,unit]) 对x截断,默认情况下,x被截断为当天的开始时间,unit是一个可选字符串参数,他指明了要截断的单元。
select sysdate S1,
TO_CHAR(trunc(sysdate),'YYYY-MM-DD') Days,--日期格式转换
trunc(sysdate) S2, --返回当前日期,无时分秒
trunc(sysdate,'year') YEAR, --返回当前年的1月1日,无时分秒
trunc(sysdate,'month') MONTH , --返回当前月的1日,无时分秒
trunc(sysdate,'day') DAY --返回当前星期的星期天,无时分秒
from dual
备注:
1.select trunc(sysdate) from dual --2019/6/24 今天的日期为2019/6/24
2.select trunc(sysdate, 'mm') from dual --2019/6/1 返回当月.
3.select trunc(sysdate,'yy') from dual --2019-1-1 返回当年
4.select trunc(sysdate,'dd') from dual --2019/6/24 返回当前年月日
5.select trunc(sysdate,'yyyy') from dual --2019-1-1 返回当年第一天
6.select trunc(sysdate,'d') from dual --2019/6/23 (星期天)返回当前星期的第一天
7.select trunc(sysdate, 'hh') from dual --2019/6/24 17:00:00
8.select trunc(sysdate, 'mi') from dual --2019/6/24 17:57:00 TRUNC()函数没有秒的精确