mysql时间相关的函数
近日因为需要从别人的数据库中获取对应的数据,添加到自己的数据库中,所以涉及到了时间处理这一块,故而在此记录平时工作中用到的以及需要学习的。
首先,时间在数据库中的记录方式有多种,有存时间戳、时间不同格式字符串的(如:yyyyMMddHHmmss),也有存储对应的时间数据类型。
下面是mysql的时间和日期数据类型:
字符串类型 | 描述 |
---|---|
DATE | YYYY-MM-DD 格式的日期值 |
TIME | hh:mm:ss 格式的时间值 |
DATETIME | YYYY-MM-DD hh:mm:ss 格式的日期和时间值 |
TIMESTAMP | YYYY-MM-DD hh:mm:ss 格式的时间戳记值 |
这里记录一下dateTime 和timeStamp这两个的区别
-
DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
-
DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。
-
DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。注意:第三点为默认行为,mysql中可以手动指定DateTime为CURRENT_TIMESTAMP,见下面的建表语句
CREATE TABLE IF NOT EXISTS test.t_date ( id int NOT NULL PRIMARY KEY, my_local_date date NOT NULL COMMENT 'myLocalDate', my_local_date_time datetime NULL COMMENT 'myLocalDateTime', my_local_time time NULL COMMENT 'myLocalTime', my_date datetime DEFAULT CURRENT_TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'myDate', my_timestamp timestamp DEFAULT CURRENT_TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'myTimestamp' ) COMMENT '时间表' CHARSET = utf8mb4;
获取当前日期、当前时间以及日期和时间的函数
当前日期:CURRENT_DATE, CURRENT_DATE(), CURDATE();
SELECT CURRENT_DATE, CURRENT_DATE(), CURDATE();
2020-07-12 2020-07-12 2020-07-12
SELECT CURDATE(), CURDATE() + 0, CURDATE() + 1
2020-07-12 20200712 20200713
当前时间: CURTIME([fsp]) CURRENT_TIME, CURRENT_TIME([fsp])
SELECT current_time,current_time(),curtime()
15:34:49 15:34:49 15:34:49
SELECT curtime(), curtime(2), curtime(6);
15:35:41 15:35:41.030000000 15:35:41.031212000
SELECT curtime(), curtime() + 1, curtime() + 0
15:36:33 153634 153633
当前日期和时间:CURRENT_TIMESTAMP, CURRENT_TIMESTAMP([fsp]) NOW([fsp]) LOCALTIME, LOCALTIME([fsp]) LOCALTIMESTAMP, LOCALTIMESTAMP([fsp])
SELECT NOW(), -->2020-07-12 16:06:55
current_timestamp(), -->2020-07-12 16:06:55
current_timestamp, -->2020-07-12 16:06:55
localtime, -->2020-07-12 16:06:55
localtime(), -->2020-07-12 16:06:55
localtimestamp, -->2020-07-12 16:06:55
localtimestamp() -->2020-07-12 16:06:55
SELECT now(), now(2), now(6);
2020-07-12 16:10:26 2020-07-12 16:10:26.660000000 2020-07-12 16:10:26.660563000
SELECT NOW(), SLEEP(2), NOW();
2020-07-12 16:11:46 0 2020-07-12 16:11:46
SELECT SYSDATE(), SLEEP(2), SYSDATE();
2020-07-12 16:11:48 0 2020-07-12 16:11:50
总结:
- curdate()函数语法:Returns the current date as a value in ‘YYYY-MM-DD’ or YYYYMMDD format, depending on whether the function is used in a string or numeric context
- CURTIME([fsp]) 函数语法:Returns the current time as a value in ‘HH:MM:SS’ or HHMMSS format, depending on whether the function is used in a string or numeric context. The value is expressed in the current time zone.(当前时区) If the fsp argument is given to specify a fractional seconds precision from 0 to 6, the return value includes a fractional seconds part of that many digits(如果fsp存在数值的话,那么获取对应小数位的毫秒、微秒)
- 获取当前时间和日期的函数见上,均为获取当前日期时间的一种方式,
- now()和sysdate()的区别在于:now()函数返回语句开始执行的时间;而sysdate()返回函数执行到的时间。
获取时间戳的函数
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date) FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format)
SELECT UNIX_TIMESTAMP(), unix_timestamp(now() + 0), unix_timestamp('20200712162200'), unix_timestamp(20200712)
1594542316 1594542316 1594542120 1594483200
SELECT from_unixtime(unix_timestamp()), -->2020-07-12 16:40:54
from_unixtime(unix_timestamp()) + 0, -->20200712164054
from_unixtime(unix_timestamp(), '%Y/%m/%d %H.%i.%s') -->2020/07/12 16.40.54
总结:
- UNIX_TIMESTAMP 无参数时获取当前时间的时间戳,当date存在时,获取该时间的时间戳。注意date的日期时间格式问题,通用的几种格式都支持将其转为时间戳的方式。
- FROM_UNIXTIME(date)函数UNIX时间戳转换为普通格式的时间,与UNIX_TIMESTAMP(date)函数互为反函数,其中format可以参看DATE_FORMAT函数
获取年份、月份、星期、季度、小时、分钟和秒钟的函数
年份:YEAR(date) 月份: MONTH(date), MONTHNAME(date),季度:QUARTER(date)
SELECT year('1999/12/12'), year(now());
1999 2020
SELECT month('1999/12/12'), month(now()), monthname(now())
12 7 July
SELECT quarter('2020-07-15')
3
星期:WEEK(date[,mode]) WEEKOFYEAR(date)
SELECT week('2020-07-11'), week('2020-07-13'), week('2020-07-13', 1)
27 28 29
SELECT weekofyear('2020-07-15'), week('2020-07-15', 3), weekday('2020-07-15')
29 29 2
小时 :HOUR(time) 分钟:MINUTE(time) 秒钟:SECOND(time)
SELECT hour('2020-07-15 12:12:12'), hour(now());
12 21
SELECT minute('2020-07-15 12:12:12'), minute(now());
12 12
SELECT SECOND('2020-07-15 12:12:12'), SECOND(now());
12 34
总结:
- WEEKOFYEAR(date) 该函数和WEEK(date,3)具有同样的效果
- WEEK(date[,mode])函数中的mode为可选参数,用于确定周数计算的逻辑。它允许您指定本周是从星期一还是星期日开始,可以通过sql语句:SHOW VARIABLES LIKE ‘default_week_format’ 获取默认值,关于mode影响week函数:
获取日期的指定值
EXTRACT(type FROM date)
SELECT EXTRACT(YEAR_MONTH FROM '2020-07-15 12:13:14'), extract(HOUR_MINUTE FROM '2020-07-15 12:13:14')
202007 1213
总结:
- EXTRACT(type FROM date)函数提取日期中的一部分。type值为YEAR时,只返回年值。type为YEAR_MONTH时返回年与月份。type为DAY_MINUTE时,返回日、小时和分钟值。具体的type可以参看官方文档:[https://dev.mysql.com/doc/refman/8.0/en/expressions.html#temporal-interv%20als](https://dev.mysql.com/doc/refman/8.0/en/expressions.html#temporal-interv als)
计算日期和时间的函数
DATE_ADD(date,INTERVAL expr unit),ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)
DATE_SUB(date,INTERVAL expr unit) SUBDATE(date,INTERVAL expr unit), SUBDATE(expr,days)
ADDTIME(expr1,expr2) SUBTIME(expr1,expr2)
# 加减时间
SELECT ADDTIME('2020-07-15 12:13:14', '1 1:01:01'), 2020-07-16 13:14:15
ADDTIME('12:13:14', '1 1:01:01'), 37:14:15
ADDTIME('2020-07-15 12:13:14', '1:01:01'), 2020-07-15 13:14:15
SUBTIME('2020-07-15 12:13:14', '1 1:01:01'), 2020-07-14 11:12:13
SUBTIME('12:13:14', '1 1:01:01'), -12:47:47
SUBTIME('2020-07-15 12:13:14', '1:01:01') 2020-07-15 11:12:13
# 增加时间
SELECT adddate('2020-07-15 12:13:14', INTERVAL 1 DAY), 2020-07-16 12:13:14
adddate('2020-07-15 12:13:14', 1), 2020-07-16 12:13:14
adddate('2020-07-15 12:13:14', INTERVAL 1 HOUR), 2020-07-15 13:13:14
date_add('2020-07-15 12:13:14', INTERVAL 1 HOUR) 2020-07-15 13:13:14
总结:
- 使用ADDTIME(expr1,expr2) SUBTIME(expr1,expr2)对时间进行加减。
- ADDDATE(date,INTERVAL expr DAY), ADDDATE(expr,days),将函数的单位修改为天之后,这两个函数的功能是等同的
- DATE_ADD(date,INTERVAL expr unit),ADDDATE(date,INTERVAL expr unit)两个函数的功能是一致的,均为增加固定的时间单位,具体的可以参看官方文档,链接[https://dev.mysql.com/doc/refman/8.0/en/expressions.html#temporal-interv%20als](https://dev.mysql.com/doc/refman/8.0/en/expressions.html#temporal-interv als)
日期和时间格式化
DATE_FORMAT(date,format) GET_FORMAT({DATE|TIME|DATETIME}, {‘EUR’|‘USA’|‘JIS’|‘ISO’|‘INTERNAL’})
STR_TO_DATE(str,format)
SELECT DATE_FORMAT('2020-07-15 12:13:14', '%H:%i:%s'), 12:13:14
DATE_FORMAT('2020-07-15 12:13:14', '%Y-%m-%d %H:%i:%s') 2020-07-15 12:13:14
SELECT get_format(DATE, 'ISO'), %Y-%m-%d
get_format(DATETIME, 'ISO'), %Y-%m-%d %H:%i:%s
get_format(TIME, 'ISO') %H:%i:%s
SELECT DATE_FORMAT('2020-07-15 12:13:14', get_format(DATE, 'ISO')), 2020-07-15
DATE_FORMAT('2020-07-15 12:13:14', get_format(TIME, 'ISO')), 12:13:14
DATE_FORMAT('2020-07-15 12:13:14', get_format(DATETIME, 'ISO')) 2020-07-15 12:13:14
SELECT str_to_date('2020-07-15-12:13:14', '%Y-%m-%d-%H:%i:%s'), 2020-07-15 12:13:14
str_to_date('2020-07-15-12:13:14', '%Y-%m-%d %H:%i:%s') NULL
总结:
- DATE_FORMAT(date,format)根据format指定的格式显示date值。具体的格式仍旧是参看官方文档
- GET_FORMAT()函数显示不同格式化类型下的格式字符串,具体的格式参看官方文档。我们可以在date_format函数中使用get_format函数
- STR_TO_DATE(str,format) 为将字符串按照指定的格式转换为时间,如果字符串和时间格式不匹配,返回null