mysql时分类型_MySQL 时间类型

时间类型

日期时间类型占用空间日期格式最小值最大值零值表示描述

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语句中没有指定该列的更新值,则默认更新为当前时间。

基本操作

以下示例将创建一张数据表,并且插入一些时间类型的数据。

使用now()函数可获取当前时间

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(),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,ymd,hms,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>

常用函数

获取时间

获取当前完整时间可使用函数now()

只获取部分时间可使用部分时间的函数对其进行包裹

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,"2020-01-12 12:0:0",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,"2020-01-12 12:0:0",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';

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值