timestamp时间戳类型在mysql数据库中比较常见,但是我们很容易忽视它的一些特征,这个我在面试中吃过亏,这里对他的一些用法和特点补充一下。也让自己加深印象。一般来说,我们使用日期,一般采用date,或者datetime,仅仅使用时间的话使用time。

下面大致说明一下timestamp与datetime的区别:

1、他们都可以表示日期时间,默认格式都是"YYYY-MM-DD HH:MM:SS",都可以通过now()或者'20200307225430'或者'2020-03-07 22:54:30'等值来设置值。

2、他们表示的时间范围不同:timestamp表示的是世界标准时间1970-01-01 00:00:01 - 2038-01-19 03:14:07,对于我们中国北京时间(东八区)来说,需要在小时上+8,也就是1970-01-01 08:00:01 - 2038-01-19 11:14:07。而datetime时间范围是1000-01-01 00:00:00 - 9999-12-31 23:59:59。

3、默认情况下,timestamp有默认值current_timestamp,也就是当前时间,然后每次修改的时候,会自动刷新。而datetime除非手动修改值,否则不会自动刷新。

对于设置值,我们通过如下的sql执行结果来看看:

mysql> update users set name='aaaa',create_date=now(),modify_date=now();
Query OK, 3 rows affected (0.05 sec)
Rows matched: 3  Changed: 3  Warnings: 0mysql> select * from users;
+----+------+---------------------+---------------------+
| id | name | create_date         | modify_date         |
+----+------+---------------------+---------------------+
|  1 | aaaa | 2020-03-07 22:56:53 | 2020-03-07 22:56:53 |
|  2 | aaaa | 2020-03-07 22:56:53 | 2020-03-07 22:56:53 |
|  3 | aaaa | 2020-03-07 22:56:53 | 2020-03-07 22:56:53 |
+----+------+---------------------+---------------------+
3 rows in set (0.00 sec)mysql> update users set name='aaaa',create_date='20200307225730',modify_date=20200307225700;
Query OK, 3 rows affected (0.05 sec)
Rows matched: 3  Changed: 3  Warnings: 0mysql> update users set name='aaaa',create_date='2020-03-07 22:57:30',modify_date='2020-03-07 22:57:00';
Query OK, 0 rows affected (0.05 sec)
Rows matched: 3  Changed: 0  Warnings: 0mysql> select * from users;
+----+------+---------------------+---------------------+
| id | name | create_date         | modify_date         |
+----+------+---------------------+---------------------+
|  1 | aaaa | 2020-03-07 22:57:30 | 2020-03-07 22:57:00 |
|  2 | aaaa | 2020-03-07 22:57:30 | 2020-03-07 22:57:00 |
|  3 | aaaa | 2020-03-07 22:57:30 | 2020-03-07 22:57:00 |
+----+------+---------------------+---------------------+
3 rows in set (0.00 sec)

对于时间timestamp的时间范围,我们可以通过如下的sql语句来感受一下:

对于最小时间:

mysql> update users set modifydate = '19700101080000' where id = 7;
1292 - Incorrect datetime value: '19700101080000' for column 'modifydate' at row 1
mysql> update users set modifydate = '19700101080001' where id = 7;
Query OK, 0 rows affected

对于最大时间:

mysql> update users set modifydate = '20380119111408' where id = 6;
1292 - Incorrect datetime value: '20380119111408' for column 'modifydate' at row 1
mysql> update users set modifydate = '20380119111407' where id = 6;
Query OK, 0 rows affected

下面我们重点说一下timestamp默认情况以及修改记录时刷新的情况。

默认情况下,我们设置列类型为timestamp不用设置别的默认值,他的默认值就是current_timestamp,以后修改记录的时候,会刷新,我们通过建表语句来感受一下:

默认情况下,我们设置modify_date的时候,就只是指定了timestamp,并没有后面的设置默认值,并在修改的时候指定当前时间。但是我们通过show create table users查看的 sql语句来看,他出现了是指默认值,以及修改记录的时候会刷新。

我们插入一条记录,然后修改记录的名称,看看modify_date的变化:

我们可以在定义表的时候,指定默认值,不指定on update 时刷新,可以让timestamp可以和datetime一样,一经设置,后面只能通过手动修改才能发生改变,而不是自动刷新。

这时候,我们可以检验一下建表语句:

这种情况之下,列定义后面没有on update current_timestamp字样。就不会在修改记录时,自动刷新当前时间了。

还有一种情况是,我们在设置timestamp默认时间的时候,可以设置为0000-00-00 00:00:00,而不是当前时间,后面再修改记录的时候,自动刷新当前时间。虽然timestamp表示的时间范围是1970-01-01 00:00:01开始,但是默认值却可以设置为0000-00-00 00:00:00,也是很奇怪,不过确实可以。我们再修改表结构,插入记录并修改记录:

我们不妨再次查看建表语句,发现这种设置timestamp的方式有什么特别的地方:

我们看到,我们在建表的时候,仅仅指定on update current_timestamp,并没有设置默认值,但是他最后生成的语句中自带了默认值'0000-00-00 00:00:00'。

总结一下就是,timestamp有以下特征:

1、时间范围:1970-01-01 00:00:01 ----- 2038-01-19 03:14:07

2、默认情况下,建表语句仅仅指定timestamp 等价于 timestamp default current_timestamp on update current_timestamp。

他有默认值,就是当前时间,后续修改记录的时候,不用手动指定值,可以自动刷新。

3、可以接受指定值,可以设置修改记录的时候,不刷新,这时候表现就和datetime一样。

4、timestamp on update current_timestamp和timestamp not null default '0000-00-00 00:00:00' on update current_timestamp等价。

mysql中日期时间戳timestamp使用小结相关推荐

  1. php 时间戳存储 原因,将php文件中的unix时间戳存储到mysql中(store unix timestamp from php file into mysql)...

    将php文件中的unix时间戳存储到mysql中(store unix timestamp from php file into mysql) 现在我有这个代码: $mysqldate = date( ...

  2. mysql中对比月_详解Mysql中日期比较大小的方法

    假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: 代码如下 select * from product where add_time = '2 ...

  3. mysql 日期比较_详解Mysql中日期比较大小的方法

    假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: 代码如下 select * from product where add_time = '2 ...

  4. 详解Mysql中日期比较大小的方法

    假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: 代码如下 select * from product where add_time = '2 ...

  5. 关于MySQL中日期的使用

    关于MySQL中日期的使用 1 日期等于\大于\小于 2 日期增加一个时间段 date_add() 3 日期减小一个时间段 date_sub() 4 两个日期相差比较 5 时间截取 6 常见小案例 最 ...

  6. MySQL中日期时间类型与格式化

    关联博文: MySQL中常用函数之日期函数使用详解 [1]MySQL中的日期时间类型 MySQL中常用的几种时间类型有:date.datetime.time.year.timestamp 数据类型 占 ...

  7. MySQL中日期和时间类型

    https://www.cnblogs.com/wlzjdm/p/6953398.html 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 1.1 Da ...

  8. MYSQL中日期加减(前一天、后一天等)以及格式化的函数

    文章目录 序言 日期的加减 date_add和date_sub 日期的格式化 date_format 日期的差值 datediff timestampdiff 序言 最近在写定时任务,查询条件中反复的 ...

  9. mysql中日期函数_mysql中日期函数ADDDATE()函数用法大全

    摘要: 下文讲述mysql数据库中日期函数ADDDATE方法简介说明,如下所示: ADDDATE函数简介说明 ADDDATE函数是DATE_ADD函数的同义词,具有同样的功能, 其作用为:为指定的日期 ...

最新文章

  1. 目睹鸿蒙开创四大至高位面,吞噬星空 绝非鸿蒙系列,完结前最后的分析【申精】...
  2. spring cloud常用组件介绍
  3. 小师妹学JavaIO之:用Selector来发好人卡
  4. eureka多了一个莫名其妙的服务_SpringCloud 服务注册与发现组件 Eureka
  5. LeetCode 2104. 子数组范围和(单调栈)
  6. wxpython富文本_去除富文本编辑器中的标签
  7. Oier's little dream
  8. Python自定义类中定义属性的两种方式
  9. 安卓miracast花屏_创维酷开电视多屏互动Miracast玩法详解
  10. C++语音识别接口快速入门(Microsoft Speech SDK)
  11. 嵌入式Ubuntu 搭建caffee环境
  12. cad图纸批量转换pdf
  13. 面完18家大厂的算法岗位,吐血整理了一个面经!
  14. Swagger2集成JWT登陆步骤,结合Spring拦截器自定义需要登陆的URL
  15. 【Numpy】np.stack()最通俗易懂解释
  16. ubuntu16.04安装百度网盘
  17. Git runner安装
  18. 怎样使用word模板?两分钟教你搞定!
  19. 【干货】今日头条的新闻推荐算法原理
  20. 概率论考点总结类型26 统计中的卡方分布 t分布F分布

热门文章

  1. oralce企业版的安装和卸载
  2. java 适配器模式 详解(带电源插座适配 例子)
  3. Databus for Mysql
  4. 按钮点击事件的禁用和启动
  5. 程序员最浪漫情话:等我敲完代码,就和你离婚!
  6. selenium与Behave结合
  7. unique 函数 详解
  8. mysql 字段 unique_mysql 字段唯一 UNIQUE
  9. 关于修改Tcp的几个参数来提高延迟敏感应用的心得
  10. 如何选择“好公司”和“便宜的好公司”!股票量化分析工具QTYX-V2.2.0