INSERT INTO todo (title,created_on) VALUES (‘blah‘,‘2019-09-31‘);

ERROR 1292 (22007): Incorrect date value: ‘2019-09-31‘ for column ‘created_on‘ at row 1

mysql> SET SESSION sql_mode = ‘ALLOW_INVALID_DATES‘;

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO todo (title,created_on) VALUES (‘blah‘,‘2019-09-31‘);

Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> SELECT * FROM todo;

+----+------+------------+

| id | title | created_on |

+----+------+------------+

| 1 | blah | 2019-09-31 |

+----+------+------------+

1 rows in set (0.00 sec)

某些场景下你可能需要保存部分日期,比如用户只输入了年没输入月日。所以 MySQL 是支持将月日设置成 0,比如 2019-00-00。但这种情况下就无法从日期相关的操作中获得到准确的结果,比如使用 DATE_SUB() 或 DATE_ADD() 函数时。禁用月日的零值可通过开启 MySQL 的 NO_ZERO_IN_DATE 模式。

除了月日可零,MySQL 还支持设置年月日都零的值 0000-00-00,对于日期非必填的情况比较有用,因为此时它比单纯的 NULL 更有语义。可通过开启 MySQL 的 NO_ZERO_DATE 模式来禁用这个全零的值。

各日期时间零值格式如下,但实际时用时,直接简写成一个 0 效果是等效的。

Data Type

“Zero” Value

DATE

‘0000-00-00‘

TIME

‘00:00:00‘

DATETIME

‘0000-00-00 00:00:00‘

TIMESTAMP

‘0000-00-00 00:00:00‘

YEAR

0000

DATE,DATETIME,及 TIMESTAMP

三者具有相关性,都支持多种格式的自动解析,详见 Date and Time Literals。

DATE 日期格式不带时间 TIME 部分,查询时输出格式为 YYYY-MM-DD,取值范围为 1000-01-01 到 9999-12-31。

DATETIME 包含日期及时间,输出格式为 YYYY-MM-DD hh:mm:ss,取值范围 1000-01-01 00:00:00 到 9999-12-31 23:59:59。

TIMESTAMP 同 DATETIME,但取值范围基于 UTC 时间,较 DATETIME 要小,为 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC。所以使用 TIMESTAMP 格式的时间,到 2038 年会溢出,这就是 Year 2038 problem。关于该问题的讨论和解决可参见这个 StackOverflow 的回答。

既然如此,为何要使用这个取值范围更小的呢。TIMESTAMP 存储的值是带时区的。在存储时会根据当前时区转成 UTC(universal time zone) 存储,查询时也会根据时区从 UTC 转换到具体的时间。对于支持多语及国际化全球部署的应用来说,显得尤为方便。需要注意的是,这里操作基于的时区默认为服务器的时区,可通过改变 time_zone SET GLOBAL time_zone=time_zone 来修改。时区的设置也可以是以连接为单位,这样来自不同时区的请求可得到不同的时间。

TIMESTAMP 和 DATETIME 都可包含至多 6 位的小数来表示时间中毫秒(microseconds)的部分。所以,带上毫秒时完整的格式是 YYYY-MM-DD hh:mm:ss[.fraction]。前者取值范围为 1970-01-01 00:00:01.000000 到 2038-01-19 03:14:07.999999,后者为 1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.999999。

在写入时,对于非法的日期时间值,将自动存成零值,即 ‘0000-00-00‘ 或 ‘0000-00-00 00:00:00‘。

关于日期时间需要注意的点:

因为 MySQL 支持比较宽松的格式来设置日期时间,所以理论上你可以用你想用的值来做为数字之间的分界符,但使用时需要关注其解析的原理。比如给一个日期格式的列设置 10:11:12,虽然这个值看起来像时间类型,但还是可以正确在被解析成目标列的格式,即日期。如果这这个日期列设置 10:45:15 则会认为是非法值,因为 45 不是一个合法的月份值,所以存储时变成零值 0000-00-00。

日期时间与毫秒的分界符必需是小数点。

默认 MySQL 除了检查日月值是否有有效范围 1~ 31,1~12。还会将两者结合进来检查,比如 4 月没有 31。所以对于日期 2004-04-31 算是非法的,会变成零值 0000-00-00。如果不需要这样的约束检查,可开启 MySQL 的 ALLOW_INVALID_DATES 模式。

日期时间的自动初始化及更新

TIMESTAMP 和 DATETIME 还支持自动初始化(auto-initialized)和更新到当前时间(auto-updated)。

创建表定义列时,指定 DEFAULT CURRENT_TIMESTAMP 来使相应的日期时间列自动初始化。

指定 ON UPDATE CURRENT_TIMESTAMP 来使相应的日期时间列自动更新。

两者可同时作用于一个日期时间列,表示插入记录时自动初始化成当前时间,后续记录更新时自动更新到当前时间。

其中 CURRENT_TIMESTAMP 指代当前时间,与其有相同效果的还有 CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP 以及 LOCALTIMESTAMP()。

DEFAULT 除了可指定成当前时间外,也可指定一个任意的固定值,比如 DEFAULT 0 或 `DEFAULT ‘2000-01-01 00:00:00‘。

对于指定了自动初始化的列,插入时如果没指定该列的值,则会自动设置为当前的时间。

对于指定为自动更新的列,一旦一条记录中有字段变更,该日期会自动更新成变更时的时间。如果不想它更新,可在插入其他值时手动设置一下该日期列为原有的值,让其保持不变。

TIMESTAMP 和 DATETIME 在列的定义时,如果指定了小数部分,那么在配合使用 CURRENT_TIMESTAMP(fsp) 时,这个小数部分的精度需要保持一致。比如:

-- ?

CREATE TABLE t1 (

ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)

);

-- ??

CREATE TABLE t1 (

ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3)

);

TIME

时间 TIME 格式即日期时间中时间的部分,输出格式为 hh:mm:ss 或时间较大时为 hhh:mm:ss,取值范围 -838:59:59 到 838:59:59。同样地,也是支持带至多 6 位小数表示毫秒。

设置时也是支持将多种格式自动解析。对于带冒号的情况,比如 11:12 解析成 11:12:00 而不是 00:11:12。不带冒号的情况,将最右边的两位数字解析成秒(按逝去的时间来解析),比如 ‘1112‘ 和 1112 不是 11:12:00 而会解析成 00:11:12。同理,‘12‘ 和 12 会解析成 00:00:12。

YEAR

YEAR 表示日期中年的部分,是一个 1 字节大小的类型,可通过 YEAR 或 YEAR(4) 来声明,其展示宽度(display width)为 4。查询时输出格式为 YYYY,取值范围 1901 到 2155。 0000 也是合法的值。

支持使用以下格式进行设置:

使用 1901 ~ 2155 间的四位数字值。

或将上面的数字以字符串形式给定。

1 ~ 99 之间的数字,此时 1 ~ 69 解析成 2001 ~ 2069,70 ~ 99 解析成 1970 ~ 1999.

其他可返回合法值的方法,比如 NOW()。

相关资源

11.3 Date and Time Types

5.1.11 Server SQL Modes

9.1.3 Date and Time Literals

Year 2038 problem

Should I use the datetime or timestamp data type in MySQL?

MySQL Datetime vs Timestamp column types – which one I should use?

MySQL 中的日期时间类型

标签:des   日期时间   types.h   isp   cal   灵活   localtime   关于   amp

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:https://www.cnblogs.com/Wayou/p/mysql_data_type_datetime.html

mysql中所有时间类型_MySQL 中的日期时间类型相关推荐

  1. mysql根据时间回退_MySQL 中的日期时间类型

    日期时间类型中包含以下几种数据类型: 各类型都有具体的取值范围,超出或非法的其他值时,MySQL 会回退到 0.TIMESTAMP 类型是个例外,给它设置一个超出范围的值时,将保存上该类型允许的最大值 ...

  2. Mysql数据库函数(数字,字符串,日期时间)

    文章目录 Mysql数据库函数(数字,字符串,日期时间) 数学函数 字符串函数 日期函数 Mysql数据库函数(数字,字符串,日期时间) 数学函数 abs(x) :返回x的绝对值 rand() :返回 ...

  3. java 日期和字符串互转,根据当天整天时间 得到当天最后一秒的日期时间

    2019独角兽企业重金招聘Python工程师标准>>> java 日期和字符串互转,根据当天整天时间   得到当天最后一秒的日期时间 package com.hi;import ja ...

  4. moment判断日期时间是否在另一个日期时间之前

    moment判断日期时间是否在另一个日期时间之前 var q = '2019-11-22 15:30:00';var w = '2019-11-22 15:29:59';let a = moment( ...

  5. java 当天最晚时间毫秒_java 日期和字符串互转,根据当天整天时间 得到当天最后一秒的日期时间...

    java 日期和字符串互转,根据当天整天时间   得到当天最后一秒的日期时间 package com.hi; import java.text.DateFormat; import java.text ...

  6. Java时间工具类(把日期时间转换成xx秒前、xx分钟前、xx小时前...)

    Java时间工具类(把日期时间转换成xx秒前.xx分钟前.xx小时前...) package com.liuzy.javaopen.entity; import java.text.ParseExce ...

  7. mysql数据库 日志类型_MySQL中的日志类型(一)-摘要和日志的共同特征

    MySQL中的日志类型(一)-摘要和日志的共同特征 发布时间:2020-07-12 19:56:15 来源:51CTO 阅读:506 作者:月饮沙 MySQL中的日志类型 MySQL具有多种日志,用来 ...

  8. mysql高精度类型_mysql中常见的数据类型

    2.浮点数 如果希望保证值比较准确,推荐使用定点数数据类型.MySql中的浮点类型有float,double和real.他们定义方式为:FLOAT(M,D) . REAL(M,D) . DOUBLE ...

  9. c 读取mysql 时间字段_MySQL中的时间字段的几种数据类型比较

    1.序言 ​ 最近在项目开发时,对于MySQL数据库中的有关时间的字段该选用何种类型,引发了一些争论.所以做了一些简单的研究,看了一些blog,和官方文档.最后做出一个自己的总结. 2.类型比较 IN ...

最新文章

  1. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法
  2. python 网页cookie的使用
  3. 别忽视新冠轻症,它会损害你的记忆力
  4. rs.Open SQL,Conn,adOpenStatic,adLockOptimistic
  5. 计算机社团优秀成员申请书,优秀社团的成员申请书
  6. 为何被主流抛弃-江西IDC机房价格为何居高不下缺少竞争力-2014年5月江西IDC排行榜...
  7. BP: Useful report to list assigned employees
  8. Quartus DSE 初步应用
  9. 【OpenGL从入门到精通(三)】第一个点的理论
  10. 移动后端支持平台Parse将API由Ruby迁移到Go
  11. linux grep 匹配空格_17 个案例,5 分钟简单搞定 Linux 正则表达式!
  12. matlab中关于程序运行的快捷键
  13. Git笔记(5) 状态记录
  14. 声谱图,梅尔语谱,倒谱,梅尔倒谱系数
  15. django获取客户ip
  16. [代码整洁之道].(美)马丁.扫描版pdf
  17. 关于空间域到频率域的转换
  18. xrd连续扫描和步进扫描_XRD基础性问题
  19. 从微信导出表情包的简便方法 (不使用微信 for pc,无需进入文件夹寻找!)
  20. cpi计算机性能指标,将CPU时间=(CPI指令总数).ppt

热门文章

  1. 以后所有内容均以摘要方式发布
  2. 如何通过netstat命令判断是否遭受Dos功击?遭到DDoS该如何缓解?
  3. ORA-00904 的解决
  4. MySQL utf8mb4与emoji表情
  5. 用Windows Live Writer在51CTO写博客
  6. 牛客 [编程题] 回文解码
  7. 检测数(二进制形式)中1的个数
  8. QT QSqlTabModel 学习,用于从数据库中存取修改等操作。
  9. 简析将shp导入Oracle并利用geoserver将导入的数据发布
  10. 关于Reapeter的总结