MySQL日期时间函数

https://www.jianshu.com/p/01296699e3e7

NOW()、SYSDATE()、CURRENT_TIMESTAMP()
返回当前的日期和时间(以'yyyy-mm-dd hh:mm:ss'或yyyymmddhhmmss格式)

-- 2019-02-03 17:36:53
SELECT NOW()
-- 20190203173653.000000
SELECT CURRENT_TIMESTAMP() + 0
CURDATE()、CURRENT_DATE()
返回当前的日期(以'yyyy-mm-dd'或yyyymmdd格式)

-- 2019-02-03
SELECT CURDATE()
-- 2019-02-03
SELECT CURRENT_DATE()
-- 20190203
SELECT CURDATE() + 0
CURTIME()、CURRENT_TIME()
返回当前的时间(以'hh:mm:ss'或hhmmss格式)

-- 09:59:37
SELECT CURTIME()
-- 095937.000000
SELECT CURRENT_TIME() + 0
DATE()
返回日期或日期/时间表达式的日期部分

-- 2018-01-09
SELECT DATE('2018-01-09 09:45:45')
-- 2018-01-09
SELECT DATE('20180109')
-- NULL
SELECT DATE('123')
EXTRACT()
返回日期/时间的单独部分,比如年、月、日、小时、分钟等
语法:EXTRACT(unit FROM date)
其中unit值如下:
MICROSECOND、SECOND、MINUTE
HOUR、DAY、WEEK、MONTH、
QUARTER、YEAR、HOUR_MINUTE
DAY_MICROSECOND、DAY_SECOND
DAY_MINUTE、DAY_HOUR、YEAR_MONTH
SECOND_MICROSECOND、MINUTE_MICROSECOND MINUTE_SECOND、HOUR_MICROSECOND、HOUR_SECOND

SELECT EXTRACT(YEAR FROM NOW()) year,
EXTRACT(MONTH FROM NOW()) month,
EXTRACT(DAY FROM NOW()) day
DATE_ADD()、ADDDATE()
向日期添加指定的时间间隔,date参数是合法的日期表达式,expr参数是您希望添加的时间间隔(多个值以任意分隔符拼接)
语法:DATE_ADD(date,INTERVAL expr type)
type取值如下:
MICROSECOND、SECOND
MINUTE、HOUR
DAY、WEEK
MONTH、QUARTER
YEAR、SECOND_MICROSECOND
MINUTE_MICROSECOND、MINUTE_SECOND
HOUR_MICROSECOND、HOUR_SECOND
HOUR_MINUTE、DAY_MICROSECOND
DAY_SECOND、DAY_MINUTE
DAY_HOUR、YEAR_MONTH

-- 向指定字段添加两天
SELECT id,DATE_ADD(OrderDate,INTERVAL 2 DAY) AS OrderPayDate FROM Orders
-- 向指定字段减30分钟
SELECT closing_time,DATE_ADD(closing_time,INTERVAL -30 MINUTE) FROM work_shift_detail
-- 向指定时间加1分1秒(1:1 1-1都行)
SELECT DATE_ADD('2017-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND) result;
-- 综合示例:查询最晚打卡时间(下班打卡时间加上下班有效打卡时间)
SELECT DATE_ADD(closing_time,
INTERVAL + IF(ISNULL(closing_valid_time),0,closing_valid_time) MINUTE)
as lateClosingTime
DATE_SUB()、SUBDATE()
从日期减去指定的时间间隔,参数同date_add
语法:DATE_SUB(date,INTERVAL expr type)

-- 减去两天
SELECT DATE_SUB(OrderDate,INTERVAL 2 DAY)
DATEDIFF()
返回两个日期之间的天数,date1和date2参数是合法的日期或日期/时间表达式,只有值的日期部分参与计算
语法:DATEDIFF(date1,date2)

-- 1
SELECT DATEDIFF('2017-12-30','2017-12-29') AS DiffDate
-- 38
SELECT DATEDIFF('20171230','2017-11-22') AS DiffDate
-- 0
SELECT DATEDIFF('2008-12-30 19:20:54','2008-12-30 11:20:54') AS DiffDate
DATE_FORMAT()、STR_TO_DATE()
DATE_FORMAT(date,format),按指定格式对日期进行格式化操作
STR_TO_DATE(str,format),将指定格式字符串转换为日期

-- 2019-02-05
SELECT DATE_FORMAT(NOW(), "%Y-%m-%d")
-- 2019-02-05 16:19:03
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')
format取值如下:

TIME_FORMAT()
和date_format()类似,但time_format只处理小时、分钟和秒(其余符号产生一个null值或0)
语法:TIME_FORMAT(time,format)

-- 08 01
SELECT TIME_FORMAT('08:01:23','%h %i')
-- 08:01
SELECT TIME_FORMAT('2018-01-10 08:01:23','%h:%i')
UNIX_TIMESTAMP()
返回一个unix时间戳(从'1970-01-01 00:00:00'gmt开始的秒数,date默认值为当前时间)
语法:UNIX_TIMESTAMP()、UNIX_TIMESTAMP(date)

-- 1516423434
SELECT UNIX_TIMESTAMP()
-- 1516423424
SELECT UNIX_TIMESTAMP('2018-01-20 12:43:44')
FROM_UNIXTIME()
默认以'yyyy-mm-dd hh:mm:ss'或yyyymmddhhmmss格式返回时间戳的值(根据返回值所处上下文是字符串或数字)
语法:FROM_UNIXTIME(unix_timestamp)、FROM_UNIXTIME(unix_timestamp,format)

-- 2018-01-20 12:43:44
SELECT FROM_UNIXTIME(1516423424)
-- 18 01 20 12:51:55 2018
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),'%y %m %d %h:%i:%s %x')
TIME_TO_SEC()
返回time值有多少秒
语法:TIME_TO_SEC(time)

-- 80580
SELECT TIME_TO_SEC('22:23:00')
SEC_TO_TIME()
以'hh:mm:ss'或hhmmss格式返回秒数转成的time值(根据返回值所处上下文是字符串或数字)
语法:SEC_TO_TIME(seconds)

-- 22:23:00
SELECT SEC_TO_TIME(80580)
-- 222300.000000
SELECT SEC_TO_TIME(80580) + 0
DAYOFWEEK()
返回日期date是星期几(1=星期天,2=星期一,……7=星期六,odbc标准)
语法:DAYOFWEEK(date)

-- 结果:7
SELECT DAYOFWEEK('2018-01-20')
WEEKDAY()
返回日期date是星期几(0=星期一,1=星期二,……6=星期天)
语法:WEEKDAY(date)

-- 结果:5
SELECT WEEKDAY('2018-01-20 20:00:00')
DAYOFMONTH()
返回date是一月中的第几日(在1到31范围内)
语法:DAYOFMONTH(date)

-- 结果:20
SELECT DAYOFMONTH('2018-01-20')
DAYOFYEAR()
返回date是一年中的第几日(在1到366范围内)
语法:DAYOFYEAR(date)

-- 结果:51
SELECT DAYOFYEAR('2018-02-20')
MONTH()
返回date中的月份数值
语法:MONTH(date)

-- 结果:1
SELECT MONTH('2018-01-20')
DAYNAME()
返回date是星期几(按英文名返回)
语法:DAYNAME(date)

-- 结果:Saturday
SELECT DAYNAME('2018-01-20')
MONTHNAME()
返回date是几月(按英文名返回)
语法:MONTHNAME(date)

-- 结果:January
SELECT MONTHNAME('2018-01-20')
QUARTER()
返回date是一年的第几个季度
语法:QUARTER(date)

-- 结果:3
SELECT QUARTER('2018-08-20')
WEEK()
返回日期的星期数,mode默认值0,mode取值1表示周一是周的开始,0从周日开始
语法:WEEK(date[,mode])

-- 结果:2
SELECT WEEK('2018-01-20')
-- -- 结果:3
SELECT WEEK('2018-01-20',1)
YEAR()
返回date的年份(范围在1000到9999)
语法:YEAR(date)

-- 结果:2018
SELECT YEAR('2018-01-20')
HOUR()
返回time的小时数(范围是0到23)
语法:HOUR(time)

-- 结果:10
SELECT HOUR('10:05:03')
MINUTE()
返回time的分钟数(范围是0到59)
语法:MINUTE(time)

-- 结果:15
SELECT MINUTE('1998-02-03 10:15:03')
SECOND()
返回time的秒数(范围是0到59)
语法:YEAR(date)

-- 结果:30
SELECT SECOND('22:24:30')
PERIOD_ADD()
增加n个月到时期p并返回(p的格式yymm或yyyymm)
语法:PERIOD_ADD(P,N)

-- 结果:201809
SELECT PERIOD_ADD('201801',8)
SPERIOD_DIFF()
返回在时期p1和p2之间月数(p1和p2的格式yymm或yyyymm)
语法:PERIOD_DIFF(P1,P2)

-- 结果:11
SELECT PERIOD_DIFF(9802,199703)
TO_DAYS()
返回日期date是西元0年至今多少天(不计算1582年以前)
语法:TO_DAYS(date)

-- 结果:728779
SELECT TO_DAYS(950501)
-- 结果:737070
SELECT TO_DAYS('2018-01-11')
FROM_DAYS()
给出西元0年至今多少天返回date值(不计算1582年以前)
语法:FROM_DAYS(N)

-- 结果:2018-01-11
SELECT FROM_DAYS(737070)

作者:若汐缘
链接:https://www.jianshu.com/p/01296699e3e7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2020-09-05 16:51  乌卡拉卡  阅读(154)  评论(0编辑  收藏  举报