zoukankan      html  css  js  c++  java
  • MySQL里面的时间类型datetime,date,timestamp,time和year(转)

    一、基本
    如果要让这些字段存放诸如"2009-00-00"或"2009-11-31"之类的值,那么要为MySQL指定特别的SQL_MODE。
    如果没有使用NO_ZERO_DATE的SQL_MODE,那么MySQL允许存放"0000-00-00"的值,有时候这样的值比null值方便。
    (注意:TRADITIONAL模式也包含了NO_ZERO_DATE模式)
    MySQL用标准格式输出时间,但解析某字符串成世界时,尝试多种格式。
    年份若只有2位,70-99年解释为1970-1999年,00-69年解释为2000-2069年
    要想被解析成时间,字符串总应该是“年-月-日”次序。
    如果时间用在一个数字型的上下文中,时间将自动转为1个数字。
    如果解析时,超过日期或时间表示范围,MySQL自动将其转为“零”值:(如果使用NO_ZERO_DATE模式,那么会产生warning)
    datetime '0000-00-00 00:00:00'
    date      '0000-00-00'
    timestamp '0000-00-00 00:00:00'
    time      '00:00:00'
    year      0000
    “零”值是特殊的,但可以直接用这些值,这些值可以简单地写成'0'或0
    在MyODBC2.50.12及以上版本中,“零”值自动转为null值,因为MyODBC不能处理。

    二、datetime,date和timestamp类型
    datetime 显示为'YYYY-MM-DD HH:MM:SS'格式,范围为'1000-01-01 00:00:00'到'9999-12-31 23:59:59'
    date      显示为'YYYY-MM-DD'格式,范围为'1001-01-01'到'9999-12-31'
    timestamp 范围从'1970-01-01 00:00:01'UTC 到'2038-01-09 03:14:07'UTC
    1. 指定值
    指定datetime值时,可以用'2009-01-01 11:20:30','2009/01/01 11*20*30','2009*01*01 11^20^30','2009@01@01 11+20+30'等,效果是一样的。
    指定date值时,与上类似。
    指定datetime值时,也可以用字符串'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式,如'20090101112030'或'090101112030',但'20090101119030'(分钟为90)会被解析为“零”值:'0000-00-00 00:00:00'。
    指定date值时,与上类似。
    指定datetime值时,也可以用数字YYYYMMDDHHMMSS或YYMMDDHHMMSS格式,如20090101112030或090101112030。
    指定date值时,与上类似。
    指定datetime、date或timestamp值时,也可以用now()或current_date的值。
    指定datetime、date或timestamp值时,月、日、时、分、秒,若小于10,可以只写1位,如'2009-01-01 11:30:30'与'2009-1-1 11:30:30'一样。
    用数字指定时间时,可以为6、8、12或14位,6位表示YYMMDD,8位表示YYYYMMDD,12位表示YYMMDDHHMMSS,14位表示YYYYMMDDHHMMSS。
    用不带分割符的字符串指定时间时,如果字符串为8位或14位的,那么认为年份为YYYY,否则认为年份为YY,之后按顺序解析月日时分秒。
    2. 不同类型转换
    date值赋给datetime或timestamp时,时间部分为'00:00:00'。
    datetime或timestamp值赋给date时,时间部分被去掉。
    转换时注意其表示范围有所不同,超出范围的将被转为“零”值。
    3. 注意'10:11:12'会被转为'2010-11-12 00:00:00'或'2010-11-12'。
    4. timestamp类型
    从当前时区转成UTC保存,要读取时,再从UTC转成当前时区。(不发生在datetime类型上)。
    当前时区对应time_zone系统变量(缺省值为'System'表示用系统变量system_time_zone的值)
    系统变量system_time_zone的值在启动MySQL时指定,一般去TZ环境变量,或执行mysqld_safe时用--timezone选项。
    (linux安装时挑选时区,安装后时区保存在/etc/sysconfig/clock文件里。)
    若将timestamp类型字段定义为default current_timestamp,那么插入一条记录时,该timestamp字段自动被赋值为当前时间。
    若将timestamp类型字段定义为on update current_timestamp,那么修改一条记录时,该timestamp字段自动被修改为当前时间。
    在一个表里面的timestamp字段只能有下面4种定义:
    a. 是default current_timestamp
    插入时系统自动赋值,插入时若在SQL语句中指定该字段的值,则用SQL语句中的指定值。
    修改时时间值不自动改变,但可以在SQL语句中指定其值。
    b. 是on update current_timestamp
    插入时系统不自动赋值(字段为“零”值),但可以在SQL语句中指定该字段的值。
    修改时,系统自动赋值,但若SQL语句中指定其值,则用SQL语句中的指定值。
    c.两个都有default current_timestamp on update current_timestamp
    如果timestamp后面啥都不写,也相当于2个都有。
    插入修改时系统自动赋值,SQL语句中若指定,则用SQL语句中的指定值。
    d.如果default 后面写个常数,如default 20090101010000,那么插入时即为这个值。其他与上面类似。
    另外,一个表里面,如果想定义第2个timestamp字段,而且想让第2个字段有系统自动修改的机制,
    那么之前的那个字段一定要赋予default 常数(即上面d),
    然后,再给这个新的timestamp字段进行如上abc的定义,区别是这个新的timestamp字段不能后面啥不都写,
    如果啥都不写,那么插入和修改时系统不会自动赋值。
    依次类推,再想定义第3个timestamp字段,而且想让第3个字段有系统自动修改的机制,
    那么之前第2个timestamp字段一定要赋予default 常数(即上面d),
    然后,再给这个新的timestamp字段进行如上abc的定义,区别跟前面一样。
    上述current_timestamp还可以用它的同义词current_timestamp(),now(),localtime,localtime(),localtimestamp,localtimestamp()代替。
    timestamp字段缺省不允许空值,如果指定它的值为null,实际上就是用当前时间值赋给他了。
    但是,可以这样定义:
    col1 timestamp null default null, 注释:该字段可以为null,插入时缺省就是null,如果赋值null,那也真是null而不是当前时间值。
    col2 timestamp null default 0,     注释:该字段可以null,插入时缺省为0,如果赋值null,那也真是null而不是当前时间值。
    如果MySQL服务器以MAXDB SQL模式运行,那么timestamp等同于datetime类型,前面说的timestamp类型的所有描述都消失。

    三、time类型
    'HH:MM:SS'或'HHH:MM:SS'格式,范围为'-838:59:59'到'838:59:59'。
    之所以小时值可以范围这么大,是因为time类型还可以用来表示两个时间点之差。
    格式可以为'D HH:MM:SS.fraction',其中D指示天(0~34),MySQL不存储D和fraction值。
    可以为'D HH','HH:MM','HH:MM:SS','D HH','SS',不能为'MM',或'HH'。注意:'11:12'被解释为'11:12:00'。
    数字格式HHMMSS,可以为SS,MMSS,HHMMSS,HHMMSS.fraction,不能为MM或HH。注意:1112被解释为'00:11:12'。
    对于字符型来讲,时分秒如果小于10,可以写成1位。
    合法的越界的值将被MySQL自动转换成靠近它的边界值,如'-850:00:00'被转换为'-838:59:59'。
    不合法的值被MySQL自动转换为“零”值:'00:00:00'。 表中的0值不能区分是真实存储的0值还是因为不合法而被转换的0值。

    四、year类型
    year(2)或year(4),缺省为year(4)
    year(2) 范围为70(1970)-69(2069),数字0表示2000年,'0'表示“零”值:0000
    year(4) 范围为1901-2155
    SQL语句中的Min(),Max()将把year转换成1个数字,在某些时候会产生问题。 

    五、存储空间
    date 3个字节
    time 3个字节
    datetime 8个字节
    timestamp 4个字节
    year 1个字节

  • 相关阅读:
    Office 2010激活 NO KMS products detected问题
    强制换行/不换行 (兼容IE)
    el-radio再次点击取消选中
    几个 JavaScript 实用小技巧
    微信小程序-点击事件传递参数
    微信小程序-存取本地缓存
    微信小程序-路由方式
    element-ui 表格排序失效
    watch监听(数组或者对象)
    vue 引入 base64或者md5对密码进行加密
  • 原文地址:https://www.cnblogs.com/ninelands/p/3326531.html
Copyright © 2011-2022 走看看