MySQL数据类型--------日期与时间类型实战
admin
2023-05-17 20:22:20
0次

1. 背景

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

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


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

类型

5.6.4版本之前

占用字节

5.6.4版本之后

(包含5.6.3版本)

占用字节

表示范围
DATETIME86+(微秒长度-1 )/21000-01-01 00:00:00 ~ 9999-12-31 23:59:59
DATE33
1000-01-01 ~ 9999-12-31
TIMESTAMP44+(微秒长度-1 )/21970-01-01 00:00:00 UTC ~ 2038-01-19 03:14:07 UTC
YEAR11

YEAR(2): 1970 ~ 2070

YEAR(4): 1901 ~ 2155

TIME
33+(微秒长度-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'
YEAR0000
TIME'00:00:00'


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

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

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()函数执行的时间

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() 获取当前日期

mysql> SELECT CURDATE();
+------------+
| CURDATE()  |
+------------+
| 2017-06-27 |
+------------+
1 row in set (0.00 sec)


  * CURTIME() 获取当前时间

mysql> SELECT CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 09:05:51  |
+-----------+
1 row in set (0.03 sec)


 * ADDDATE() 增加日期

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

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秒 ]

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() 返回字符串中的日期

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() 返回字符串中的时间

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() 返回字符串中的年数

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


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

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


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

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


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

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


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

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


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

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版本之后]

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() 日期相减运算

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() 返回工作日的英文名称

mysql> SELECT CURDATE(), DAYNAME(CURDATE());
+------------+--------------------+
| CURDATE()  | DAYNAME(CURDATE()) |
+------------+--------------------+
| 2017-06-27 | Tuesday            |
+------------+--------------------+
1 row in set (0.01 sec)


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

mysql> SELECT CURDATE(), MONTHNAME(CURDATE());
+------------+----------------------+
| CURDATE()  | MONTHNAME(CURDATE()) |
+------------+----------------------+
| 2017-06-27 | June                 |
+------------+----------------------+
1 row in set (0.01 sec)


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

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

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


   * 查看时区

mysql> show variables like '%zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.02 sec)


  * 插入数据

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


   * 查看数据

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)


  * 更新时区

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


   * 再次查看数据

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. 总结


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


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...