蚊章汇 - 时间戳
type: channel
link: https://linuxcn.bwsl.wang/tag/%E6%97%B6%E9%97%B4%E6%88%B3/
items: MySQL 中你应该使用什么数据类型表示时间？
items: Linux touch 命令 - 为什么我们需要改变时间戳？

MySQL 中你应该使用什么数据类型表示时间？
type: item
date: 2016-09-03T16:01:00+08:00
description: 当你需要保存日期时间数据时，一个问题来了：你应该使用 MySQL 中的什么类型？使用 MySQL 原生的 DATE 类型还是使用 INT 字段把日期和时间保存为一个纯数字呢？在这篇文章中，我将解释 MySQL 原生的方案，并给出一个最常用数据类型的对比表。我们也将对一些典型的查询做基准测试，然后得出在给定场景下应该使用什么数据类型的结论。如果你想直接看结论，请翻到文章最下方。原生的 MySQL Datetime 数据类型Datetime 数据表示一个时间点。这可以用作日志记录、物联网时间戳、日历事件数据，等等。MySQL 有两种原生的类型可以将这种信息保存在单个字段中：Datetime 和 Timestamp。MySQL 文档中是这么介绍这些数据类型的：DATETIME 类型用于保存同时包含日期和时间两部分的值。MySQL 以 'YYYY-MM-DD HH:MM:SS' 形式接收和显示 DATETIME 类型的值。TIMESTAMP 类型用于保存同时包含日期和时间两部分的值。DATETIME 或 TIMESTAMP 类型的值可以在尾部包含一个毫秒部分，精确度最高到微秒（6 位数）。TIMESTAMP 和 DATETIME 数据类型提供自动初始化和更新到当前的日期和时间的功能，只需在列的定义中设置 DEFAULT CURRENTTIMESTAMP 和 ON UPDATE CURRENTTIMESTAMP。作为一个例子：CREATE TABLE `datetime_example` ( `id` int(11) NOT NULL AUTO_INCREMENT, `measured_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `measured_on` (`measured_on`) ) ENGINE=InnoDB; CREATE TABLE `timestamp_example` ( `id` int(11) NOT NULL AUTO_INCREMENT, `measured_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `measured_on` (`measured_on`) ) ENGINE=InnoDB; 除了原生的日期时间表示方法，还有另一种常用的存储日期和时间信息的方法。即使用 INT 字段保存 Unix 时间（从1970 年 1 月 1 日协调世界时（UTC）建立所经过的秒数）。MySQL 也提供了只保存时间信息中的一部分的方式，通过使用 Date、Year 或 Time 类型。由于这篇文章是关于保存准确时间点的最佳方式的，我们没有讨论这些不那么精确的局部类型。使用 INT 类型保存 Unix 时间使用一个简单的 INT 列保存 Unix 时间是最普通的方法。使用 INT，你可以确保你要保存的数字可以快速、可靠地插入到表中，就像这样：INSERT INTO `vertabelo`.`sampletable` ( `id`, `measured_on` ### INT 类型的列 ) VALUES ( 1, 946684801 ### 至 01/01/2000 @ 12:00am (UTC) 的 UNIX 时间戳 http://unixtimestamp.com ); 这就是关于它的所有内容了。它仅仅是个简单的 INT 列，MySQL 的处理方式是这样的：在内部使用 4 个字节保存那些数据。所以如果你在这个列上使用 SELECT 你将会得到一个数字。如果你想把这个列用作日期进行比较，下面的查询并不能正确工作：SELECT id, measured_on, FROM_UNIXTIME(measured_on) FROM vertabelo.inttimestampmeasures WHERE measured_on > '2016-01-01' ### measured_on 会被作为字符串比较以进行查询 LIMIT 5; 这是因为 MySQL 把 INT 视为数字，而非日期。为了进行日期比较，你必须要么获取（ LCTT 译注：从 1970-01-01 00:00:00）到 2016-01-01 经过的秒数，要么使用 MySQL 的 FROM\_UNIXTIME() 函数把 INT 列转为 Date 类型。下面的查询展示了 FROM\_UNIXTIME() 函数的用法：SELECT id, measured_o…

Linux touch 命令 - 为什么我们需要改变时间戳？
type: item
date: 2014-03-23T16:52:00+08:00
description: 我们可能在 Linux 下运用 touch 命令创建一个空文件。当然我们也可以使用其他命令例如 vi, nano 或是任意一个编辑工具来实现。但是你可能需要更多的步骤来完成操作。其实你要知道 touch 命令的主要功能并不是为了创建一个空文件哦。什么是 touch 命令众所周知，每个文件都被附有时间戳。这个时间戳记包括访问时间和修改时间。而 Touch 命令主要就是用来修改文件的访问时间和修改时间。为什么我们需要使用 touch 命令既然 touch 命令描述的是改变时间戳，那么我们可能会想为什么我们需要去改变时间戳呢?这个问题会引发我们的深思。然而，我想有个理由可以解释为什么我们需要使用它。如果你参加了一个全球范围的开源项目，那么时间戳可能变得很重要。编译源代码文件可能需要同一地区的时间戳。如果未统一，程序可能会编译失败。（译注：有强迫症的同学也很喜欢这个命令——就看不得乱七八糟的时间，;>）不带任何选项下运行 touch最简单的使用 touch 命令。只需键入：$ touch file_name 请观察下面的一张截图。File\_1.txt原来的时间戳是 12:42。在我们使用 touch 命令后，它改变为了 17:08。由此看出，默认情况下，touch 会将文件的时间戳改为当前时间。只改变访问时间正如我们之前提到的，每个文件都附有访问时间和修改时间。上面的时间戳是 17:08。我们可以看更多的细节。我们发现访问时间和修改时间的值是相同的都是 17:08:35 ,还有它们属于同一时区 GMT +7。如果现在我们要只改变访问时间，我们需要使用-a选项。$ touch -a file_1.txt 如你所见，访问时间变为了 17:51:37 ,但是修改时间仍为17:08:35。[译注：原文为 Change time(状态改变时间)应是作者笔误]只改变修改时间我们可以使用-m选项来实现。现在我们用file\_2.txt作个示例。$ touch -m file_2.txt 现在修改时间从 12:42:20 改为了 17:57:20。请注意,当文件被访问或修改时，状态改变时间域的值总会对其记录。更改为自定义时间戳-a和-m选项都会将文件的时间戳改为现在当前时间。当然我们也可以更改为自定义时间戳。使用-t选项实现。从上面示例示例中的 file\_2.txt，我们看出它的时间戳是：访问时间:12:42:20 修改时间:17:57:20 执行日期:2014-01-14 假如我们想要将访问时间和修改时间改为2014年1月12日 09:58:27。我们可以用下列命令来完成：$ touch -t 201401120958.27 file_2.txt -t 选项语法组成 :[[CC]YY]MMDDhhmm [.SS]CC - 年份的前两位 YY - 年份的后两位 MM - 月份 [01-12] DD - 日期 [01-31] hh - 时 [00-23] mm - 分 [00-59] SS - 秒 [00-61] 改变日期和时间的另一种方式如果你觉得[[CC]YY]MMDDhhmm [.SS]格式不适合你，我们也可以使用 -d 选项。下面是-d选项使用的一个示例。更改指定日期举例来说，我们有个名为 file\_3.txt 的文件，它的相关属性在下面的截图中展示了。现在我们要将日期2014年1月14日改为2013年12月20日。可以使用下列命令：$ touch -d '10-December-2013' file_3.txt 不出意料，访问时间和修改时间的日期已经改为了2013年12月10日。改变时区如果我们想改变指定GMT的时间，我们也可以使用-d选项。先让file\_3.txt 移回当前时间。$ touch file_3.txt 不难发现 file\_3.txt 的时区为 GMT +0700。要改为 GMT3 时区，我们只需要键入如下命令：$ touch -d GMT3 file_3.txt 好的，现在时间已经改为了 10:00:00 AM。结合参数下使用-d选项还可以用很酷的方式使用-d选项。请观察下面的图片。我们可以将单词 next Sunday 和 GMT 3合成一个值，而 touch 命令仍然能识别它。日期已经改为了2014年1月21日，而当前的日期为2014年1月14日。还有另一个-d选项的示例。 首先，我们要将file3\_3.txt重置到当前日期和时间。$ touch file_3.txt 然后我们尝试这个命令：$ touch -d '1 year ago 13:43:07' file_3.txt 太震撼了，Touch 甚至能识别单词‘1 year ago’。现在的日期以及时间已经改为了2013年1月14日,13:43:07。创建一…