一、实现前提:知识储备
1、DATE()和TIME()
DATE():提取日期/时间表达式的年月日部分
TIME() :提取时间或日期时间表达式的时分秒部分
2、NOW()和SYSDATE()
两者都是获取当前时间的功能。不同的是开始获取的时间点不一样:
- NOW():语句执行时获取时间
- SYSDATE():该函数执行时获取时间
这一区别可以使用sleep()函数测得:
SELECT NOW(),SLEEP(2),SYSDATE(),NOW(),SLEEP(2),SYSDATE()
3、INTERVAL
-
当函数使用时,即interval(),为比较函数,如:interval(10,1,3,5,7);结果4;
原理:10为被比较数,后面1,3,5,7为比较数,将后面四个依次与10比较,看后面数字组有多少个少于10,则返回其个数。前提是后面数字组为从小到大排列,否则返回结果0。
-
当关键词使用时,表示为设置时间间隔/时间量。
理解:
INTERVAL 1 YEAR:代表的是1年的时间量
INTERVAL 1 MONTH:代表的是1个月的时间量
INTERVAL 1 day:代表的是1天的时间量
INTERVAL 1 hour:代表的是1小时的时间量
INTERVAL 1 minute:代表的是1分钟的时间量
INTERVAL 1 second:代表的是1秒的时间量
那么:
SYSDATE() - INTERVAL 1 YEAR
的含义就是:当前时间减去1年的时间量,即表示一年前的当前时间。
4、ADDTIME(date1 ,date2)
返回 date1 + date2 的时间。
- date1:是一个时间或日期时间表达式;
- date2:是一个时间表达式。
-- 当前时间加一天
ADDTIME(SYSDATE() ,INTERVAL 1 day)
二、实现
有了前面的函数储备后,实现只修改时间字段的年月日不修改时间就非常容易了。
【示例】请修改student表中的time字段,将其在原有基础上增加一年的时间,请保持原有的月、日、时间不改变。
--方式一:适用于少量的变动,例如增加一年、增加一天、减少12小时等
update student
set
time=time+INTERVAL 1 YEAR
--方式二:适用于整体的变动,例如将年月日整体修改为指定的日期
update student
set
time=ADDTIME(DATE(time) +INTERVAL 1 YEAR,TIME(time))