MySQL日期-时区输入

时间:2018-11-06 16:26:37

标签: mysql date time formatting timezone

我对MySQL中的日期和时间格式不太熟悉,我尝试在stackoverflow上查找解决方案,但找不到任何可以专门回答我的查询的内容...

我有以下MySQL代码:

CREATE TABLE friends_details (name VARCHAR(255), last_contact DATETIME);

INSERT INTO friends_details VALUES
('Bob', '2018-09-06 04:23:51 BST');

INSERT INTO friends_details VALUES
('Eszter', '2018-01-21 17:24:06 CET');

INSERT INTO friends_details VALUES
('Sue', '2018-09-01 11:18:21 EDT');

INSERT INTO friends_details VALUES
('Jack', '2018-02-27 23:11:47 UTC');

我失败了,因为我要输入到 last_contact 字段中的值的格式与表 friends_details < / strong>已创建。

有什么办法可以专门输入last_contact字段的时区3字母代码详细信息,并使其被MySQL接受吗?

因此,如果以后再指定SELECT * FROM friends_details;,我希望能够得到以下输出:

Bob,    2018-09-06 04:23:51 BST
Eszter, 2018-01-21 17:24:06 CET
Sue,    2018-09-01 11:18:21 EDT
Jack,   2018-02-27 23:11:47 UTC

我不想在输出中将任何时间转换为UTC

1 个答案:

答案 0 :(得分:0)

一种方法是再创建一列以分别存储时区:

CREATE TABLE friends_details (name VARCHAR(255), 
                              last_contact DATETIME, 
                              timezone VARCHAR(3));

INSERT INTO friends_details VALUES
('Bob', '2018-09-06 04:23:51', 'BST');

INSERT INTO friends_details VALUES
('Eszter', '2018-01-21 17:24:06', 'CET');

INSERT INTO friends_details VALUES
('Sue', '2018-09-01 11:18:21', 'EDT');

INSERT INTO friends_details VALUES
('Jack', '2018-02-27 23:11:47', 'UTC');

请注意,在您的应用程序代码(例如PHP)中,您可以对日期时间(带有时区)进行字符串操作,并分别提取时区,以进行Insert查询。


但是,通常的做法是将时间存储在UTC中,并在第二列中存储与UTC的实际时区差距(以小时为单位)。

例如:

CREATE TABLE friends_details (name VARCHAR(255), 
                              last_contact_utc DATETIME, 
                              timezone_gap decimal(5,2));

-- CET is UTC + 1, so the time in UTC will be CET - 1
INSERT INTO friends_details VALUES
('Eszter', '2018-01-21 16:24:06', 1);

-- EDT is UTC - 4, so the time in UTC will be EDT + 4
INSERT INTO friends_details VALUES
('Sue', '2018-09-01 15:18:21', -4);

INSERT INTO friends_details VALUES
('Jack', '2018-02-27 23:11:47', 0);

现在,进行计算日期时间差的操作变得更加简单,而无需担心时区差距。对于显示,您只需获取两个列,然后将其相应地更改为相关的时区即可。