如何将日期从ISO 8601格式转换并保存到mysql列?

yhuiod9q  于 2023-06-21  发布在  Mysql
关注(0)|答案(5)|浏览(125)

我有一个表中的列(varchar)与日期在此格式2013-09- 05 T10:10:02 Z
如何使用更新查询将其转换为日期时间格式并将其保存在另一列中?

zpjtge22

zpjtge221#

可以使用STR_TO_DATE函数:

UPDATE table1 SET col2 = STR_TO_DATE(col1,'%Y-%m-%dT%TZ')

示例:

mysql> select STR_TO_DATE('2013-09-05T10:10:02Z','%Y-%m-%dT%TZ');
+----------------------------------------------------+
| STR_TO_DATE('2013-09-05T10:10:02Z','%Y-%m-%dT%TZ') |
+----------------------------------------------------+
| 2013-09-05 10:10:02                                |
+----------------------------------------------------+
1 row in set (0.00 sec)
hivapdat

hivapdat2#

您也可以使用CAST('2013-09-05T10:10:02Z' AS DATETIME),它不需要像STR_TO_DATE()那样定义格式。

rn0zuynd

rn0zuynd3#

如果你想处理时区,就使用这个查询,并使用mysqltimezone

mysql> select CONVERT_TZ("2013-09-05T10:10:02Z", "+00:00", @@session.time_zone);

+-------------------------------------------------------------------+
| CONVERT_TZ("2013-09-05T10:10:02Z", "+00:00", @@session.time_zone) |
+-------------------------------------------------------------------+
| 2013-09-05 12:10:02                                               |
+-------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

或任何其他时区

mysql> select CONVERT_TZ("2013-09-05T10:10:02Z", "+00:00", "+03:00");
+--------------------------------------------------------+
| CONVERT_TZ("2013-09-05T10:10:02Z", "+00:00", "+03:00") |
+--------------------------------------------------------+
| 2013-09-05 13:10:02                                    |
+--------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
k10s72fa

k10s72fa4#

我尝试使用上面的cast方法,但会得到截断错误,如注解中所述。
您也可以使用CAST('2013 -09- 05 T10:10:02 Z' AS DATETIME),它不需要像STR_TO_DATE()中那样的格式定义。
我总是会得到:Error: Truncated incorrect datetime value: '2011-10-02T23:25:42Z'
我在查询中使用它之前,通过将值转换为@变量来修复它。下面是一个存储过程的例子:

CREATE PROCEDURE `new_procedure`(IN p_date VARCHAR(50), p_text VARCHAR(500))
BEGIN

SET @datestring = CAST(p_date AS DATETIME);

-- used for debugging
SELECT @datestring, p_text;

INSERT INTO testtable(timestamp, text) VALUES(@datestring, p_text);

END
ttygqcqt

ttygqcqt5#

这并不是你要求的格式,而是为了正确处理时区(例如'2023-06-06T13:00:00+07:00'),在MariaDB中使用此函数:

DELIMITER //

DROP FUNCTION IF EXISTS ISO2UTC;

CREATE FUNCTION ISO2UTC(iso_datetime VARCHAR(255))
RETURNS DATETIME DETERMINISTIC
BEGIN
  DECLARE datetime_part VARCHAR(255);
  DECLARE offset_str VARCHAR(5);
  DECLARE offset_seconds INT;
  DECLARE unix_timestamp_utc0 INT;
  DECLARE unix_timestamp_utc INT;
  DECLARE datetime_utc DATETIME;

  SET datetime_part = SUBSTRING_INDEX(iso_datetime, '+', 1);
  SET offset_str = SUBSTRING_INDEX(iso_datetime, '+', -1);
  SET offset_seconds = TIME_TO_SEC(CONCAT(offset_str, ':00'));
  SET unix_timestamp_utc0 = UNIX_TIMESTAMP(STR_TO_DATE(datetime_part, '%Y-%m-%dT%H:%i:%s'));
  SET unix_timestamp_utc = unix_timestamp_utc0 - offset_seconds;
  SET datetime_utc = FROM_UNIXTIME(unix_timestamp_utc);

  RETURN datetime_utc;
END//

DELIMITER ;

然后SELECT ISO2UTC('2023-06-06T13:00:00+07:00');将返回

2023-06-06 06:00:00

如所期望的。

相关问题