zoukankan      html  css  js  c++  java
  • 【Mysql】Datetime和Timestamp区别,及mysql中各种时间的使用

    说到数据库时间类型,大部分同学都会想到date、datetime、timestamp之类的。

    我之前在项目遇到一个问题,测试同事在测试时,由于会测试205几年的数据,在入库时会抛出数据库异常,原因就是timestamp是有最大年份限制的。

    下面先说说datetime与timestamp的区别:

    • datetime的默认值为null,timestamp的默认值不为null,且为系统当前时间(current_timestatmp)。如果不做特殊处理,且update没有指定该列更新,则默认更新为当前时间。
    • datetime占用8个字节,timestamp占用4个字节。timestamp利用率更高
    • 二者存储方式不一样,对于timestamp,它把客户端插入的时间从当前时区转化为世界标准时间(UTC)进行存储,查询时,逆向返回。但对于datetime,基本上存什么是什么。
    • 二者范围不一样。timestamp范围:‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’; datetime范围:’1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。原因是,timestamp占用4字节,能表示最大的时间毫秒为2的31次方减1,也就是2147483647,换成时间刚好是2038-01-19 03:14:07.999999

    Mysql中常用到的时间相关的函数:

    • 常用函数

     

    • Mysql服务器的三种时区设置

    1. 系统时区 - 保存在系统变量system_time_zone
    2. 服务器时区 - 保存在全局系统变量global.time_zone
    3. 每个客户端连接的时区 - 保存在会话变量session.time_zone

      注意:客户端时区,会影响一些日期函数返回值的显示,例如:now()、curtime()、curdate(),也影响timestamp列值的显示。

      默认情况下,客户端时区和服务器时区相同,均为SYSTEM,表示使用系统时区。

    • 函数特殊说明

      1、NOW([fsp]):返回服务器的当前日期和时间(fsp指定小数秒的精度,取值0--6)

        now()函数的同义词有:CURRENT_TIMESTAMP 、 CURRENT_TIMESTAMP()、LOCALTIMESTAMP 、 LOCALTIMESTAMP()、LOCALTIME 、 LOCALTIME()。

      2、SYSDATE( ):返回服务器的当前日期和时间。

        与now()不同之处,now()返回语句执行时间,sysdate()返回函数执行时间。

      3、CURTIME([fsp]):返回当前时间,只包含时分秒(fsp指定小数秒的精度,取值0--6)

        同义词有:CURRENT_TIME 、 CURRENT_TIME() 

      4、CURDATE():返回当前日期,只包含年月日

        同义词有: CURRENT_DATE 、CURRENT_DATE()

      5、TIMEDIFF(expr1, expr2):返回两个日期相减(expr1 − expr2 )相差的时间数(两个参数类型必须相同)

    mysql> select timediff('18:32:59','60000');
    +------------------------------+
    | timediff('18:32:59','60000') |
    +------------------------------+
    | 12:32:59                     |
    +------------------------------+
    
    
    mysql> select timediff('18:32:59','2017-1-1 60000');
    +---------------------------------------+
    | timediff('18:32:59','2017-1-1 60000') |
    +---------------------------------------+
    | NULL                                  |
    +---------------------------------------+
    

         DATEDIFF(expr1, expr2):返回两个日期相减(expr1 − expr2 )相差的天数。

    mysql> select datediff('2017-3-24 18:32:59','2016-9-1');
    +-------------------------------------------+
    | datediff('2017-3-24 18:32:59','2016-9-1') |
    +-------------------------------------------+
    |                                       204 |
    +-------------------------------------------+
    

      

      6、日期时间运算函数:分别为给定的日期date加上(add)或减去(sub)一个时间间隔值expr

        DATE_ADD(date, INTERVAL  expr  unit);

        DATE_SUB(date, INTERVAL  expr  unit);

        interval是间隔类型关键字

        expr是一个表达式,对应后面的类型

        unit是时间间隔的单位(间隔类型)(20个)

        hour - 小时;minute - 分;second - 秒;microsecond - 毫秒; year - 年;month - 月;

        day - 日;  week - 周; quarter - 季; year_month - 年和月;day_hour - 日和小时;

        day_minute - 日和分钟;day_second - 日和秒;hour_minute - 小时和分;hour_second - 小时和秒;

        minute_second - 分钟和秒。

     

    mysql> select now(),date_add(now(),interval 1 day);  #加一天
    +---------------------+--------------------------------+
    | now()               | date_add(now(),interval 1 day) |
    +---------------------+--------------------------------+
    | 2017-03-24 14:53:08 | 2017-03-25 14:53:08            |
    +---------------------+--------------------------------+
    
    mysql> SELECT date_sub('2005-01-01 00:00:00',INTERVAL '1 1:1:1' DAY_SECOND);  #减1天1小时1分1秒
    +---------------------------------------------------------------+
    | date_sub('2005-01-01 00:00:00',INTERVAL '1 1:1:1' DAY_SECOND) |
    +---------------------------------------------------------------+
    | 2004-12-30 22:58:59                                           |
    +---------------------------------------------------------------+

      7、选取日期时间的各个部分:日期、时间、年、季度、月、日、小时、分钟、秒、微秒(常用)

        SELECT now(),date(now()); -- 日期

        SELECT now(),time(now()); -- 时间

        SELECT now(),year(now()); -- 年

        SELECT now(),quarter(now()); -- 季度

        SELECT now(),month(now()); -- 月

        SELECT now(),week(now()); -- 周

        SELECT now(),day(now()); -- 日

        SELECT now(),hour(now()); -- 小时

        SELECT now(),minute(now()); -- 分钟

        SELECT now(),second(now()); -- 秒

        SELECT now(),microsecond(now()); -- 微秒

     

        EXTRACT(unit  FROM  date):从日期中抽取出某个单独的部分或组合

        SELECT now(),extract(YEAR FROM now()); -- 年

        SELECT now(),extract(QUARTER FROM now()); -- 季度

        SELECT now(),extract(MONTH FROM now()); -- 月

        SELECT now(),extract(WEEK FROM now()); -- 周

        SELECT now(),extract(DAY FROM now()); -- 日

        SELECT now(),extract(HOUR FROM now()); -- 小时

        SELECT now(),extract(MINUTE FROM now()); -- 分钟

        SELECT now(),extract(SECOND FROM now()); -- 秒

        SELECT now(),extract(YEAR_MONTH FROM now()); -- 年月

        SELECT now(),extract(HOUR_MINUTE FROM now()); -- 时分

  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/liuxs13/p/9760812.html
Copyright © 2011-2022 走看看