Merge pull request #29284 from wxy/20230208.1-️-Improve-your-coding-skills-with-temporal-values-in-MySQL

RP:published/20230208.1 ️ Improve your coding skills with temporal values in MySQL.md
This commit is contained in:
Xingyu.Wang 2023-05-02 17:12:13 +08:00 committed by GitHub
commit 80b87243e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,29 +3,33 @@
[#]: author: "Hunter Coleman https://opensource.com/users/hunterc"
[#]: collector: "lkxed"
[#]: translator: "hanszhao80"
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-15774-1.html"
使用 MySQL 中的时间值提高你的编码技能
在 MySQL 中处理时间
======
流行数据库系统 MySQL 的新老用户常常会对数据库处理时间值的方式感到困惑。有时用户不会费心去了解时间值数据类型。这可能是因为他们觉得本身也没有什么好了解的。日期就是日期,对吧?好吧,并非总是如此。花几分钟时间了解 MySQL 如何存储和显示日期和时间是有益的。学习如何最好地利用数据库表中的时间值可以帮助你成为更好的编码者。
![][0]
> 这篇关于 MySQL 中日期和时间的概述将帮助你在数据库表中处理时间值。
流行数据库系统 MySQL 的新老用户常常会对数据库处理时间值的方式感到困惑。有时用户不会费心去了解时间值的数据类型。这可能是因为他们觉得本身也没有什么好了解的。日期就是日期,对吧?好吧,并非总是如此。花几分钟时间了解 MySQL 如何存储和显示日期和时间是有益的。学习如何最好地利用数据库表中的时间值可以帮助你成为更好的编码者。
### MySQL 时间值类型
当你在 MySQL 中新建表时,选择合适的数据类型(`INT`、`FLOAT`、`CHAR`等高效地保存插入到表中的数据。MySQL 为时间值提供了五种数据类型。它们是 `DATE`、`TIME`、`DATETIME`、`TIMESTAMP` 和 `YEAR`
当你在 MySQL 中新建表时,选择合适的数据类型(`INT`、`FLOAT`、`CHAR` 高效地保存插入到表中的数据。MySQL 为时间值提供了五种数据类型。它们是 `DATE`、`TIME`、`DATETIME`、`TIMESTAMP` 和 `YEAR`
MySQL 使用 `ISO 8601` 格式来存储以下格式的值LCTT 译注国际标准ISO 8601是国际标准化组织的日期和时间的表示方法全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》
MySQL 使用 `ISO 8601` 格式来存储以下格式的值LCTT 译注:国际标准 ISO 8601是国际标准化组织的日期和时间的表示方法全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》
- **DATE**  YYYY-MM-DD
- **TIME**   HH:MM:SS
- **TIMESTAMP** YYYY-MM-DD  HH:MM:SS
- **YEAR** YYYY
- `DATE``YYYY-MM-DD`
- `TIME``HH:MM:SS`
- `TIMESTAMP``YYYY-MM-DD HH:MM:SS`
- `YEAR`YYYY`
### Datetime 与 Timestamp 的比较
### DATETIME 与 TIMESTAMP 的比较
你可能已经注意到 <ruby>日期时间<rt>DATETIME</rt></ruby><ruby>时间戳<rt>TIMESTAMP</rt></ruby> 数据类型有相同的数据。你可能想知道这两者之间是否有差异。答案是:有。
你可能已经注意到 <ruby>日期时间<rt>DATETIME</rt></ruby><ruby>时间戳<rt>TIMESTAMP</rt></ruby> 数据类型有相同的数据。你可能想知道这两者之间是否有差异。答案是:有。
首先,可以使用的日期范围不同。`DATETIME` 可以保存 1000-01-01 00:00:00 和 9999-12-31 23:59:59 之间的日期,而 `TIMESTAMP` 的范围更有限,从 1970-01-01 00:00:01 到 2038-01-19 03:14:07 UTC。
@ -47,15 +51,15 @@ mysql> show variables like 'explicit_default%';
mysql> set explicit_defaults_for_timestamp = 0;
```
### Time
### TIME
MySQL 的 <ruby>时间<rt>TIME</rt></ruby> 数据类型可能看起来很简单,但有几件事是一个优秀的程序员应该牢记的。
首先要注意的是,虽然 time 经常被认为是一天中的时间,但它实际上是经过的时间。换句话说,它可以是一个负值,或者可以大于 23:59:59。在 MySQL 中,一个 `TIME` 值的范围可以是 -838:59:59 到 838:59:59。
首先要注意的是,虽然 `TIME` 经常被认为是一天中的时间,但它实际上是经过的时间。换句话说,它可以是一个负值,或者可以大于 23:59:59。在 MySQL 中,一个 `TIME` 值的范围可以是 -838:59:59 到 838:59:59。
另外如果你缩写一个时间值MySQL 会因你是否使用冒号作出不同解释。例如10:34 这个值被 MySQL 看作是 10:34:00。也就是说十点过后的 34 分钟。但是,如果你不使用冒号写作 `1034`MySQL 将其视为 00:10:34意思是 10 分钟 34 秒。
最后,你应该知道 `TIME` 值(以及 `DATETIME``TIMESTAMP` 字段的时间部分)从5.6.4版本开始,可以取一个小数单位。要使用它,请在数据类型定义的结尾处添加一个整数(最大值为 6的圆括号。
最后,你应该知道 `TIME` 值(以及 `DATETIME``TIMESTAMP` 字段的时间部分)从 5.6.4 版本开始,可以取一个小数部分。要使用它,请在数据类型定义的结尾处添加一个整数(最大值为 6的圆括号。
```
time_column TIME(2)
@ -99,7 +103,7 @@ the_date date not null);
mysql> insert into test (the_date) VALUES ('2022-01-05');
```
我在我的 test 表中插入了四行日期值,你插入多少行都可以。
我在我的 `test` 表中插入了四行日期值,你插入多少行都可以。
有时你可能想知道某一天是星期几。MySQL 给了你几种实现方法。
@ -170,7 +174,7 @@ mysql> SELECT EXTRACT(YEAR FROM the_date) FROM test;
### 插入和读取不同格式的日期
正如之前提到的MySQL 使用 `ISO 8601` 格式存储日期和时间值。但是如果你想以另一种方式存储日期和时间值,例如 `MM-DD-YYYY` 格式怎么办首先不要尝试。MySQL 以 8601 格式存储日期和时间,就是这样。不要尝试更改它。但是,这并不意味着你必须在将数据输入到数据库之前将数据转换为特定的格式,或者你不能以任何你想要的格式展示数据。
正如之前提到的MySQL 使用 `ISO 8601` 格式存储日期和时间值。但是如果你想以另一种方式存储日期和时间值,例如 `MM-DD-YYYY` 格式,怎么办?首先,不要尝试这样做。MySQL 以 8601 格式存储日期和时间,就是这样。不要尝试更改它。但是,这并不意味着你必须在将数据输入到数据库之前将数据转换为特定的格式,或者你不能以任何你想要的格式展示数据。
如果你想要将非 ISO 的格式的日期输入到表中,你可以使用 `STR_TO_DATE()` 函数。第一个参数是你想要存储在数据库中的日期的字符串值。第二个参数是格式化字符串,它让 MySQL 知道日期的组织方式。让我们看一个简单的例子,然后我将更深入地研究这个看起来很奇怪的格式化字符串是什么。
@ -184,13 +188,13 @@ Query OK, 1 row affected (0.00 sec)
一些其他常用的格式化字符串字符是:
- `%b` 缩写月份的名称 (例如: Jan)
- `%c` 数字月份 (例如: 1)
- `%W` 日期名称 (例如: Saturday)
- `%a` 日期名称的缩写 (例如: Sat)
- `%T` 24 小时制的时间 (例如: 22:01:22)
- `%r` 带 AM/PM 的 12 小时制的时间 (例如: 10:01:22 PM)
- `%y` 两位数的年份 (例如: 23)
- `%b` 缩写月份的名称(例如: `Jan`
- `%c` 数字月份(例如: 1
- `%W` 星期名称(例如: `Saturday
- `%a` 星期名称的缩写(例如: `Sat`
- `%T` 24 小时制的时间(例如: `22:01:22`
- `%r` 带 AM/PM 的 12 小时制的时间(例如: `10:01:22 PM`
- `%y` 两位数的年份(例如: 23
请注意,对于两位数年份 `%y`,年份范围是 1970 到 2069。因此从 70 到 99 的数字被假定为 20 世纪,而从 00 到 69 的数字被假定为 21 世纪。
@ -209,10 +213,12 @@ mysql> SELECT DATE_FORMAT(the_date, '%W, %b. %d, %y') FROM test;
4 rows in set (0.00 sec)
```
### 结
###
本教程应该为你提供了一个关于 MySQL 中的日期和时间值的有用的概述。我希望本文教会了您一些新知识,使您能够更好地控制和理解 MySQL 数据库如何处理时间值。
*题图MJ/76b6481a-a271-4e81-bc17-dd7fbe08a240*
--------------------------------------------------------------------------------
via: https://opensource.com/article/23/2/temporal-values-mysql
@ -220,10 +226,11 @@ via: https://opensource.com/article/23/2/temporal-values-mysql
作者:[Hunter Coleman][a]
选题:[lkxed][b]
译者:[hanszhao80](https://github.com/hanszhao80)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/hunterc
[b]: https://github.com/lkxed/
[1]: https://opensource.com/downloads/mariadb-mysql-cheat-sheet
[0]: https://img.linux.net.cn/data/attachment/album/202305/02/170932wivx7l84red2dvip.png