时间类型
日期时间类型 | 占用空间 | 日期格式 | 最小值 | 最大值 | 零值表示 | 描述 |
---|---|---|---|---|---|---|
DATETIME | 8 bytes | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 0000-00-00 00:00:00 | 获取年月日时分秒毫秒 |
TIMESTAMP | 4 bytes | YYYY-MM-DD HH:MM:SS | 1970-01-01 08:00:01 | 2038-01-19 03:14:07 | 00000000000000 | 获取年月日时分秒毫秒 |
DATE | 4 bytes | YYYY-MM-DD | 1000-01-01 | 9999-12-31 | 0000-00-00 | 获取年月日 |
TIME | 3 bytes | HH:MM:SS | -838:59:59 | 838:59:59 | 00:00:00 | 获取时分秒 |
YEAR | 1 bytes | YYYY | 1901 | 2155 | 0000 | 获取年 |
MysqL保存日期格式使用 YYYY-MM-DD HH:MM:SS的ISO 8601标准
向数据表储存日期与时间必须使用ISO格式
DATATIME与TIMESTAMP的差异区别
在实际应用的很多场景中,MysqL
的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。
1.
DATETIME
的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。2.
DATETIME
存储时间与时区无关,TIMESTAMP
存储时间与时区有关,显示的值也依赖于时区。在MysqL
服务器,操作系统以及客户端连接都有时区的设置。3.
DATETIME
使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP
比DATETIME
的空间利用率更高。4.
DATETIME
的默认值为null
;TIMESTAMP
的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update
语句中没有指定该列的更新值,则默认更新为当前时间。
基本操作
以下示例将创建一张数据表,并且插入一些时间类型的数据。
MysqL> create table temp(
-> y year,# 年
-> ymd date,# 年月日
-> hms time,# 时分秒
-> ct datetime # 年月日时分秒
-> );
Query OK,0 rows affected (0.03 sec)
MysqL> insert into temp(y,ymd,hms,ct) values
-> (Now(),Now(),Now());
Query OK,1 row affected,1 warning (0.00 sec)
MysqL> select * from temp; # 不同的类型会返回不同的结果
+------+------------+----------+---------------------+
| y | ymd | hms | ct |
+------+------------+----------+---------------------+
| 2020 | 2020-08-29 | 21:20:06 | 2020-08-29 21:20:06 |
+------+------------+----------+---------------------+
1 row in set (0.00 sec)
MysqL>
也可以使用字符串的形式进行插入,但是要严格按照格式进行插入。
MysqL> insert into temp(y,ct) values
-> ("1998","1998-01-28","19:18:22","1998-01-28 19:18:22");
Query OK,1 row affected (0.00 sec)
MysqL> select * from temp;
+------+------------+----------+---------------------+
| y | ymd | hms | ct |
+------+------------+----------+---------------------+
| 2020 | 2020-08-29 | 21:20:06 | 2020-08-29 21:20:06 |
| 1998 | 1998-01-28 | 19:18:22 | 1998-01-28 19:18:22 |
+------+------------+----------+---------------------+
2 rows in set (0.00 sec)
MysqL>
设默认值
使用DATATIME
时由于其没有默认值的设定,故我们需要为它设定默认值。
以下示例将演示创建出一张user
表,并设置regtime
字段,不用手动插入时间而是自动生成。
MysqL> create table user(
-> regtime datetime not null default Now(),# 注册时间 不能为空,自动生成当前时间。
-> username varchar(12) not null # 用户名
-> );
Query OK,0 rows affected (0.06 sec)
MysqL> insert into user(username) values("云崖");
Query OK,1 row affected (0.00 sec)
MysqL> insert into user(username) values("Jack");
Query OK,1 row affected (0.00 sec)
MysqL> insert into user(username) values("Ken");
Query OK,1 row affected (0.00 sec)
MysqL> select * from user;
+---------------------+----------+
| regtime | username |
+---------------------+----------+
| 2020-08-29 21:32:37 | 云崖 |
| 2020-08-29 21:32:42 | Jack |
| 2020-08-29 21:32:47 | Ken |
+---------------------+----------+
3 rows in set (0.01 sec)
MysqL>
查询格式化
参数介绍
格式 | 描述 |
---|---|
%a | 缩写星期名 |
%b | 缩写月名 |
%c | 月,数值 |
%D | 带有英文前缀的月中的天 |
%d | 月的天,数值(00-31) |
%e | 月的天,数值(0-31) |
%f | 微秒 |
%H | 小时 (00-23) |
%h | 小时 (01-12) |
%I | 小时 (01-12) |
%i | 分钟,数值(00-59) |
%j | 年的天 (001-366) |
%k | 小时 (0-23) |
%l | 小时 (1-12) |
%M | 月名 |
%m | 月,数值(00-12) |
%p | AM 或 PM |
%r | 时间,12-小时(hh:mm:ss AM 或 PM) |
%s | 秒(00-59) |
%s | 秒(00-59) |
%T | 时间,24-小时 (hh:mm:ss) |
%U | 周 (00-53) 星期日是一周的第一天 |
%u | 周 (00-53) 星期一是一周的第一天 |
%V | 周 (01-53) 星期日是一周的第一天,与 %X 使用 |
%v | 周 (01-53) 星期一是一周的第一天,与 %x 使用 |
%W | 星期名 |
%w | 周的天 (0=星期日,6=星期六) |
%X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%Y | 年,4 位 |
%y | 年,2 位 |
操作演示
Date_format(字段,格式化内容)
或者TIME_FORMAT(字段,格式化内容)
用于格式化时间
注意:
TIME_FORMAT()
只包含时分秒,并不包含年月日
以下示例将创建一张temp
表,并拥有时间类型字段ct
,对他进行查询格式化操作。
MysqL> create table temp( # 创建表
-> ct datetime
-> );
Query OK,0 rows affected (0.02 sec)
MysqL> insert into temp(ct) values(Now()); # 插入记录,当前时间
Query OK,1 row affected (0.00 sec)
MysqL> select date_format(ct,'%Y年%m月%d %H时%i分%s秒') from temp; # 时间格式化
+-------------------------------------------+
| date_format(ct,'%Y年%m月%d %H时%i分%s秒') |
+-------------------------------------------+
| 2020年08月29 21时49分01秒 |
+-------------------------------------------+
1 row in set (0.00 sec)
MysqL> select time_format(ct,'%Y年%m月%d %H时%i分%s秒') from temp; # 时间格式化
+-------------------------------------------+
| time_format(ct,'%Y年%m月%d %H时%i分%s秒') |
+-------------------------------------------+
| 0000年00月00 21时49分01秒 |
+-------------------------------------------+
1 row in set (0.00 sec)
MysqL>
常用函数
获取时间
MysqL> select Now(); # 获取当前时间
+---------------------+
| Now() |
+---------------------+
| 2020-08-29 21:54:16 |
+---------------------+
1 row in set (0.00 sec)
MysqL> select year(Now()); # 只获取当前年份
+-------------+
| year(Now()) |
+-------------+
| 2020 |
+-------------+
1 row in set (0.00 sec)
MysqL> select year("2020-01-12"); # 只获取年份,格式必须正确
+--------------------+
| year("2020-01-12") |
+--------------------+
| 2020 |
+--------------------+
1 row in set (0.00 sec)
MysqL>
其他可以使用的函数如下
函数 | 说明 |
---|---|
不需要包裹 | |
Now() | 当前时间,完整的年月日时分秒 |
CURRENT_DATE() | 当前日期,年月日 |
CURRENT_TIME() | 当前时间,时分秒 |
需要包裹 | |
YEAR() | 年(范围从1000 到 9999) |
MONTH() | 月(范围从1到12) |
DAY() | 日(范围从1开始) |
HOUR() | 时(范围从0到23) |
MINUTE() | 分(范围从0到59) |
SECOND() | 秒(范围从0到59) |
TIME() | 只获取时间,即时分秒。 |
WEEK() | 一年中的第几周,从1开始计数 |
QUARTER() | 一年中的季度,从1开始计数 |
DAYOFYEAR() | 一年中的第几天(从1开始) |
DAYOFMONTH() | 月份中天数(从1开始) |
DAYOFWEEK() | 星期天(1)到星期六(7) |
WEEKDAY() | 星期一(0)到星期天(6) |
TO_DAYS() | 从元年到现在的天数(忽略时间部分) |
FROM_DAYS() | 根据天数得到日期(忽略时间部分) |
TIME_TO_SEC() | 时间转为秒数(忽略日期部分) |
SEC_TO_TIME() | 根据秒数转为时间(忽略日期部分) |
UNIX_TIMESTAMP() | 根据日期返回秒数(包括日期与时间) |
FROM_UNIXTIME() | 根据秒数返回日期与时间(包括日期与时间) |
DATEDIFF() | 两个日期相差的天数(忽略时间部分,前面日期减后面日期) |
TIMEDIFF() | 计算两个时间的间隔(忽略日期部分) |
TIMESTAMPDIFF() | 根据指定单位计算两个日期时间的间隔(包括日期与时间) |
LAST_DAY() | 该月的最后一天 |
时间拆分
以下示例将展示将某一时间拆分成不同的部分
MysqL> create table timetest( # 只有一个ctime字段的表
-> ctime datetime not null default Now()
-> );
Query OK,0 rows affected (0.05 sec)
MysqL> insert into timetest values(); # 由于设置了datetime默认值,所以插入一条空记录就会自动进行创建
Query OK,1 row affected (0.01 sec)
MysqL> select YEAR(ctime),MONTH(ctime),# 拆分查询
-> DAY(ctime),MINUTE(ctime),-> SECOND(ctime) from timetest;
+-------------+--------------+------------+---------------+---------------+
| YEAR(ctime) | MONTH(ctime) | DAY(ctime) | MINUTE(ctime) | SECOND(ctime) |
+-------------+--------------+------------+---------------+---------------+
| 2020 | 8 | 29 | 16 | 48 |
+-------------+--------------+------------+---------------+---------------+
1 row in set (0.00 sec)
MysqL>
当前时间
以下示例将展示如何获取当前时间
MysqL> select current_time(),current_date(),Now();
+----------------+----------------+---------------------+
| current_time() | current_date() | Now() |
+----------------+----------------+---------------------+
| 22:20:42 | 2020-08-29 | 2020-08-29 22:20:42 |
+----------------+----------------+---------------------+
1 row in set (0.00 sec)
MysqL>
时间计算
以下示例将展示计算出当前时间位于一年中的第几周,季度,第几天。
MysqL> select week(Now()) as "一年中第几周",-> quarter(Now()) as "当前季度",-> dayofyear(Now()) as "一年中第几天";
+--------------+----------+--------------+
| 一年中第几周 | 当前季度 | 一年中第几天 |
+--------------+----------+--------------+
| 34 | 3 | 242 |
+--------------+----------+--------------+
1 row in set (0.00 sec)
MysqL>
时间转换
以下示例将展示如何进行不包含日期的秒转换
MysqL> select Now() as "当前时间",-> time_to_sec(Now()) as "当前时间转秒数",-> sec_to_time(time_to_sec(Now())) as "当前秒数转时间";
+---------------------+----------------+----------------+
| 当前时间 | 当前时间转秒数 | 当前秒数转时间 |
+---------------------+----------------+----------------+
| 2020-08-29 22:31:55 | 81115 | 22:31:55 |
+---------------------+----------------+----------------+
1 row in set (0.00 sec)
MysqL>
以下示例将展示如何进行日期时间与秒转换
MysqL> select Now() as "当前时间",-> unix_timestamp(Now()) as "当前时间转秒数",-> from_unixtime(unix_timestamp(Now())) as "当前秒数转时间";
+---------------------+----------------+---------------------+
| 当前时间 | 当前时间转秒数 | 当前秒数转时间 |
+---------------------+----------------+---------------------+
| 2020-08-29 22:34:04 | 1598711644 | 2020-08-29 22:34:04 |
+---------------------+----------------+---------------------+
1 row in set (0.00 sec)
MysqL>
以下示例将展示如何进行日期时间与天数转换
MysqL> select Now() as "当前时间",-> to_days(Now()) as "元年到现在的天数",-> from_days(to_days(Now())) as "天数转换为年份(不包含时间)";
+---------------------+------------------+------------------------------+
| 当前时间 | 元年到现在的天数 | 天数转换为年份(不包含时间) |
+---------------------+------------------+------------------------------+
| 2020-08-29 22:36:21 | 738031 | 2020-08-29 |
+---------------------+------------------+------------------------------+
1 row in set (0.00 sec)
MysqL>
差值计算
以下示例将展示如何进行计算天数差值,忽略时间部分
MysqL> select Now() as "当前时间",datediff(Now(),"2020-01-12 12:0:0") as "2020年1月12日距离现在相差的天数";
+---------------------+---------------------------------+
| 当前时间 | 2020年1月12日距离现在相差的天数 |
+---------------------+---------------------------------+
| 2020-08-29 22:40:25 | 230 |
+---------------------+---------------------------------+
1 row in set (0.00 sec)
MysqL>
以下示例将展示如何进行计算时间差值,忽略天数
MysqL> select Now() as "当前时间",timediff(Now(),"2020-01-12 12:0:0") as "2020年1月12日距离现在相差的时间";
+---------------------+---------------------------------+
| 当前时间 | 2020年1月12日距离现在相差的时间 |
+---------------------+---------------------------------+
| 2020-08-29 22:39:58 | 838:59:59 |
+---------------------+---------------------------------+
1 row in set,1 warning (0.00 sec)
MysqL>
差值单位
使用timestampdiff()
可指定差值单位,支持的单位有 YEAR/MONTH/WEEK/DAY/HOUR/MINUTE/SECOND等
注意,这个是后面减前面
MysqL> select Now() as "当前时间",timestampdiff(minute,"2020-01-12 12:0:0",Now()) as "2020年1月12日距离现在相差 的分钟数";
+---------------------+-----------------------------------+
| 当前时间 | 2020年1月12日距离现在相差的分钟数 |
+---------------------+-----------------------------------+
| 2020-08-29 22:51:53 | 331851 |
+---------------------+-----------------------------------+
1 row in set (0.00 sec)
MysqL> select Now() as "当前时间",timestampdiff(hour,Now()) as "2020年1月12日距离现在相差的 小时数";
+---------------------+-----------------------------------+
| 当前时间 | 2020年1月12日距离现在相差的小时数 |
+---------------------+-----------------------------------+
| 2020-08-29 22:52:00 | 5530 |
+---------------------+-----------------------------------+
1 row in set (0.00 sec)
MysqL> select Now() as "当前时间",timestampdiff(day,Now()) as "2020年1月12日距离现在相差的天数";
+---------------------+---------------------------------+
| 当前时间 | 2020年1月12日距离现在相差的天数 |
+---------------------+---------------------------------+
| 2020-08-29 22:52:06 | 230 |
+---------------------+---------------------------------+
1 row in set (0.00 sec)
MysqL>
时间计算
函数 | 说明 |
---|---|
ADDTIME | 添加时间(负数为减少),只对时间有效 |
TIMESTAMP | 添加时间(负数为减少),只对时间有效 |
DATE_ADD | 根据单位添加时间,支持单位有YEAR/MONTH/DAY/HOUR/MINUTE/SECOND/HOUR_MINUTE/DAY_HOUR/DAY_MINUTE/DAY_SECOND/HOUR_MINUTE/HOUR_SECOND(负数时等于DATE_SUB) |
DATE_SUB | DATE_ADD的反函数 |
LAST_DAY | 指定月最后一天日期 |
七小时前的时间
MysqL> select ADDTIME(Now(),'-7:00:00');
+---------------------------+
| ADDTIME(Now(),'-7:00:00') |
+---------------------------+
| 2020-08-29 15:53:55 |
+---------------------------+
1 row in set (0.00 sec)
MysqL>
七天后的日期
MysqL> SELECT DATE_ADD(Now(),INTERVAL 7 DAY);
+--------------------------------+
| DATE_ADD(Now(),INTERVAL 7 DAY) |
+--------------------------------+
| 2020-09-05 22:54:19 |
+--------------------------------+
1 row in set (0.00 sec)
MysqL>
20小时10分钟后的日期
MysqL> SELECT DATE_ADD(Now(),INTERVAL '20:10' HOUR_MINUTE);
+----------------------------------------------+
| DATE_ADD(Now(),INTERVAL '20:10' HOUR_MINUTE) |
+----------------------------------------------+
| 2020-08-30 19:04:45 |
+----------------------------------------------+
1 row in set (0.00 sec)
MysqL>
2天8小时后的日期
MysqL> SELECT DATE_ADD(Now(),INTERVAL '2 8' DAY_HOUR);
+-----------------------------------------+
| DATE_ADD(Now(),INTERVAL '2 8' DAY_HOUR) |
+-----------------------------------------+
| 2020-09-01 06:55:15 |
+-----------------------------------------+
1 row in set (0.00 sec)
MysqL>
获取本月最后一天日期
MysqL> SELECT LAST_DAY(Now());
+-----------------+
| LAST_DAY(Now()) |
+-----------------+
| 2020-08-31 |
+-----------------+
1 row in set (0.00 sec)
MysqL>
获取本月的第一天日期
MysqL> SELECT DATE_SUB(Now(),INTERVAL DAYOFMONTH(Now())-1 DAY);
+--------------------------------------------------+
| DATE_SUB(Now(),INTERVAL DAYOFMONTH(Now())-1 DAY) |
+--------------------------------------------------+
| 2020-08-01 22:56:05 |
+--------------------------------------------------+
1 row in set (0.00 sec)
MysqL>
查询使用
MysqL
内部将日期按数值进行处理,下面是查找'1990-02-22 09:00:00' 日期可以写成数值形式
SELECT * FROM users WHERE birthday = 19900222090000
当然也可以写成字符串格式,查找在 1990~1999年出生的同学
SELECT * FROM stu WHERE birthday BETWEEN '1990-01-01' AND '1999-12-31';
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。