MySQL数据类型--------日期与时间类型实战

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

1. 背景

  * MySQL支持多种表示日期和时间的数据类型,如YEAR、TIME、DATETIME、TIMESTAMP等等……

   * MySQL 5.6.4版本开始支持微秒(支持类型:TIMTE、DATETIME、TIMESTAMP, 微秒长度最大为6) 


2. 日期与时间类型所属空间与表示范围

类型

5.6.4版本之前

占用字节

5.6.4版本之后

(包含5.6.3版本)

占用字节

表示范围
DATETIME 8 6+(微秒长度-1 )/2 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
DATE 3 3
1000-01-01 ~ 9999-12-31
TIMESTAMP 4 4+(微秒长度-1 )/2 1970-01-01 00:00:00 UTC ~ 2038-01-19 03:14:07 UTC
YEAR 1 1

YEAR(2): 1970 ~ 2070

YEAR(4): 1901 ~ 2155

TIME
3 3+(微秒长度-1 )/2 -838:59:59 ~ 838:59:59


3. 日期与时间类型 "0" 值格式

类型 Zero Value
DATETIME '0000-00-00 00:00:00'
DATE '0000-00-00'
TIMESTAMP '0000-00-00 00:00:00'
YEAR 0000
TIME '00:00:00'


4. 日期与时间类型相关函数操作

  * NOW() 获取语句开始执行的日期和时间,[ MySQL 5.6.3版本之后可以获取微秒 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2017-06-27 09:00:13 |
+---------------------+
1 row  in  set  (0.00 sec)
 
mysql> SELECT NOW(6);
+----------------------------+
| NOW(6)                     |
+----------------------------+
| 2017-06-27 09:18:50.720849 |
+----------------------------+
1 row  in  set  (0.00 sec)


  * SYSDATE() 获取SYSDATE()函数执行的时间

1
2
3
4
5
6
7
mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
+---------------------+----------+---------------------+
| SYSDATE()           | SLEEP(2) | SYSDATE()           |
+---------------------+----------+---------------------+
| 2017-06-27 09:38:03 |        0 | 2017-06-27 09:38:05 |
+---------------------+----------+---------------------+
1 row  in  set  (2.01 sec)


 * CURDATE() 获取当前日期

1
2
3
4
5
6
7
mysql> SELECT CURDATE();
+------------+
| CURDATE()  |
+------------+
| 2017-06-27 |
+------------+
1 row  in  set  (0.00 sec)


  * CURTIME() 获取当前时间

1
2
3
4
5
6
7
mysql> SELECT CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 09:05:51  |
+-----------+
1 row  in  set  (0.03 sec)


 * ADDDATE() 增加日期

  [ 在当前日期上增加 10 天 ]

1
2
3
4
5
6
7
mysql> SELECT CURDATE(), ADDDATE(CURDATE(),  "10" );
+------------+--------------------------+
| CURDATE()  | ADDDATE(CURDATE(),  "10" ) |
+------------+--------------------------+
| 2017-06-27 | 2017-07-07               |
+------------+--------------------------+
1 row  in  set  (0.02 sec)


  * ADDTIME() 增加时间

    [ 在当前时间上增加1天1小时1分1秒 ]

1
2
3
4
5
6
7
mysql> SELECT NOW(), ADDTIME(NOW(),  '1 1:1:1' );
+---------------------+---------------------------+
| NOW()               | ADDTIME(NOW(),  '1 1:1:1' ) |
+---------------------+---------------------------+
| 2017-06-27 09:00:21 | 2017-06-28 10:01:22       |
+---------------------+---------------------------+
1 row  in  set  (0.02 sec)


  * DATE() 返回字符串中的日期

1
2
3
4
5
6
7
mysql> SELECT NOW(), DATE(NOW());
+---------------------+-------------+
| NOW()               | DATE(NOW()) |
+---------------------+-------------+
| 2017-06-27 09:07:18 | 2017-06-27  |
+---------------------+-------------+
1 row  in  set  (0.00 sec)


  * TIME() 返回字符串中的时间

1
2
3
4
5
6
7
mysql> SELECT NOW(), TIME(NOW());
+---------------------+-------------+
| NOW()               | TIME(NOW()) |
+---------------------+-------------+
| 2017-06-27 09:07:40 | 09:07:40    |
+---------------------+-------------+
1 row  in  set  (0.01 sec)


  * YEAR() 返回字符串中的年数

1
2
3
4
5
6
7
mysql> SELECT NOW(), YEAR(NOW());
+---------------------+-------------+
| NOW()               | YEAR(NOW()) |
+---------------------+-------------+
| 2017-06-27 09:12:39 |        2017 |
+---------------------+-------------+
1 row  in  set  (0.00 sec)


  * MONTH() 返回字符串中的月数

1
2
3
4
5
6
7
mysql> SELECT NOW(), MONTH(NOW());
+---------------------+--------------+
| NOW()               | MONTH(NOW()) |
+---------------------+--------------+
| 2017-06-27 09:13:09 |            6 |
+---------------------+--------------+
1 row  in  set  (0.01 sec)


  * DAY() 返回字符串中的日数

1
2
3
4
5
6
7
mysql> SELECT NOW(), DAY(NOW());
+---------------------+------------+
| NOW()               | DAY(NOW()) |
+---------------------+------------+
| 2017-06-27 09:12:08 |         27 |
+---------------------+------------+
1 row  in  set  (0.01 sec)


  * HOUR() 返回字符串中的小时数

1
2
3
4
5
6
7
mysql> SELECT NOW(), HOUR(NOW());
+---------------------+-------------+
| NOW()               | HOUR(NOW()) |
+---------------------+-------------+
| 2017-06-27 09:13:57 |           9 |
+---------------------+-------------+
1 row  in  set  (0.00 sec)


  * MINUTE() 返回字符串中的分钟数

1
2
3
4
5
6
7
mysql> SELECT NOW(), MINUTE(NOW());
+---------------------+---------------+
| NOW()               | MINUTE(NOW()) |
+---------------------+---------------+
| 2017-06-27 09:15:38 |            15 |
+---------------------+---------------+
1 row  in  set  (0.00 sec)


  * SECOND() 返回字符串中的秒数

1
2
3
4
5
6
7
mysql> SELECT NOW(), SECOND(NOW());
+---------------------+---------------+
| NOW()               | SECOND(NOW()) |
+---------------------+---------------+
| 2017-06-27 09:16:23 |            23 |
+---------------------+---------------+
1 row  in  set  (0.02 sec)


  * MICROSECOND() 返回字符串中的微秒数 [MySQL 5.6.3版本之后]

1
2
3
4
5
6
7
mysql> SELECT NOW(6), MICROSECOND(NOW(6));
+----------------------------+---------------------+
| NOW(6)                     | MICROSECOND(NOW(6)) |
+----------------------------+---------------------+
| 2017-06-27 09:18:11.264125 |              264125 |
+----------------------------+---------------------+
1 row  in  set  (0.01 sec)


  * DATEDIFF() 日期相减运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT DATEDIFF( '2017-06-29' '2017-06-09' );
+--------------------------------------+
| DATEDIFF( '2017-06-29' '2017-06-09' ) |
+--------------------------------------+
|                                   20 |
+--------------------------------------+
1 row  in  set  (0.00 sec)
 
mysql> SELECT DATEDIFF( '2017-06-29' '2017-07-09' );
+--------------------------------------+
| DATEDIFF( '2017-06-29' '2017-07-09' ) |
+--------------------------------------+
|                                  -10 |
+--------------------------------------+
1 row  in  set  (0.03 sec)


  * DAYNAME() 返回工作日的英文名称

1
2
3
4
5
6
7
mysql> SELECT CURDATE(), DAYNAME(CURDATE());
+------------+--------------------+
| CURDATE()  | DAYNAME(CURDATE()) |
+------------+--------------------+
| 2017-06-27 | Tuesday            |
+------------+--------------------+
1 row  in  set  (0.01 sec)


 * MONTHNAME() 返回月的英文名称

1
2
3
4
5
6
7
mysql> SELECT CURDATE(), MONTHNAME(CURDATE());
+------------+----------------------+
| CURDATE()  | MONTHNAME(CURDATE()) |
+------------+----------------------+
| 2017-06-27 | June                 |
+------------+----------------------+
1 row  in  set  (0.01 sec)


  * PERIOD_DIFF() 月数相减运算 [ 格式是YYYYMM或者YYMM ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT PERIOD_DIFF(201706, 201705);
+-----------------------------+
| PERIOD_DIFF(201706, 201705) |
+-----------------------------+
|                           1 |
+-----------------------------+
1 row  in  set  (0.00 sec)
 
mysql> SELECT PERIOD_DIFF(201706, 201707);
+-----------------------------+
| PERIOD_DIFF(201706, 201707) |
+-----------------------------+
|                          -1 |
+-----------------------------+
1 row  in  set  (0.00 sec)


 …………等等,详情查看官网手册

5. TIMESTAMP 和 DATETIME 区别 [ TIMESTAMP VS DATETIME]

  * timestamp相比较datetime所占空间字节小。

   * timestamp容易所支持的范围比timedate要小。 并且容易出现超出的情况

   * timestamp受时区timezone的影响以及MYSQL版本和服务器的SQL MODE的影响, 而datetime不受时区影响.

  

6. 时间影响实验

   * 创建表 t_d

1
2
3
4
5
mysql> CREATE TABLE t_d(
     -> t TIMESTAMP,
     -> d DATETIME
     -> )ENGINE=INNODB CHARSET=utf8mb4;
Query OK, 0 rows affected (0.09 sec)


   * 查看时区

1
2
3
4
5
6
7
8
mysql> show variables like  '%zone%' ;
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows  in  set  (0.02 sec)


  * 插入数据

1
2
3
mysql> INSERT INTO t_d SELECT NOW(), NOW();
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0


   * 查看数据

1
2
3
4
5
6
7
mysql> SELECT * FROM t_d;
+---------------------+---------------------+
| t                   | d                   |
+---------------------+---------------------+
| 2017-06-27 09:44:13 | 2017-06-27 09:44:13 |
+---------------------+---------------------+
1 row  in  set  (0.00 sec)


  * 更新时区

1
2
mysql>  set  time_zone =  '+0:00' ;
Query OK, 0 rows affected (0.00 sec)


   * 再次查看数据


1
2
3
4
5
6
7
mysql> SELECT * FROM t_d;
+---------------------+---------------------+
| t                   | d                   |
+---------------------+---------------------+
| 2017-06-27 01:44:13 | 2017-06-27 09:44:13 |
+---------------------+---------------------+
1 row  in  set  (0.01 sec)


7. 总结


以需求驱动技术,技术本身没有优略之分,只有业务之分。



      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1943290,如需转载请自行联系原作者




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 存储
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
165 0
【MySQL】——数据类型及字符集
|
2月前
|
机器学习/深度学习 存储 关系型数据库
MySQL数据库:常用数据类型
【2月更文挑战第7天】
29 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
101 1
|
25天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
95 0
|
20天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
1天前
|
关系型数据库 MySQL 中间件
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-02 死锁和死锁检测
【4月更文挑战第19天】在高并发环境下,死锁发生在多个线程间循环等待资源时,导致无限期等待。MySQL中,死锁可通过`innodb_lock_wait_timeout`参数设置超时或`innodb_deadlock_detect`开启死锁检测来解决。默认的50s超时可能不适用于在线服务,而频繁检测会消耗大量CPU。应对热点行更新引发的性能问题,可以暂时关闭死锁检测(风险是产生大量超时),控制并发度,或通过分散记录减少锁冲突,例如将数据分拆到多行以降低死锁概率。
16 1
|
4天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
25 6
|
11天前
|
存储 关系型数据库 MySQL
【MySQL实战笔记】 04 | 深入浅出索引(上)-02
【4月更文挑战第9天】InnoDB数据库使用B+树作为索引模型,其中主键索引的叶子节点存储完整行数据,非主键索引则存储主键值。主键查询只需搜索一棵树,而非主键查询需两次搜索,因此推荐使用主键查询以提高效率。在插入新值时,B+树需要维护有序性,可能导致数据页分裂影响性能。自增主键在插入时可避免数据挪动和页分裂,且占用存储空间小,通常更为理想。然而,如果场景仅需唯一索引,可直接设为主键以减少查询步骤。
13 1
【MySQL实战笔记】 04 | 深入浅出索引(上)-02
|
13天前
|
存储 SQL 关系型数据库
【MySQL实战笔记】03.事务隔离:为什么你改了我还看不见?-02
【4月更文挑战第7天】数据库通过视图实现事务隔离,不同隔离级别如读未提交、读已提交、可重复读和串行化采用不同策略。以可重复读为例,MySQL使用多版本并发控制(MVCC),每个事务有其独立的视图。回滚日志在无更早视图时被删除。长事务可能导致大量存储占用,应避免。事务启动可显式用`begin`或设置`autocommit=0`,但后者可能意外开启长事务。建议使用`autocommit=1`并显式管理事务,若需减少交互,可使用`commit work and chain`。
29 5
|
15天前
|
SQL 存储 关系型数据库
【MySQL实战笔记】02.一条SQL更新语句是如何执行的-2
【4月更文挑战第5天】两阶段提交是为确保`redo log`和`binlog`逻辑一致,避免数据不一致。若先写`redo log`, crash后数据可能丢失,导致恢复后状态错误;若先写`binlog`,crash则可能导致重复事务,影响数据库一致性。一天一备相较于一周一备,能缩短“最长恢复时间”,但需权衡额外的存储成本。
16 1