• 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字节。因此,TIMESTAMPDATETIME的空间利用率更高。

       4.DATETIME的默认值为nullTIMESTAMP的字段默认不为空(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';
    
  • 相关阅读:
    参数探测(Parameter Sniffing)与影响计划重用的SET选项
    The workbook can not be opened
    参数Sniffing问题
    Unable to connect SQL Server
    正则|和[]的区别
    form的target捕捉不到动态写入name的iframe
    windows下git bash乱码问题
    ie6,7下textarea等上方空白
    根据字数截取字符串,不能截断url
    浏览器hack
  • 原文地址:https://www.cnblogs.com/Yunya-Cnblogs/p/13585119.html
Copyright © 2020-2023  润新知