我有一个表中的列(varchar)与日期在此格式2013-09- 05 T10:10:02 Z如何使用更新查询将其转换为日期时间格式并将其保存在另一列中?
zpjtge221#
可以使用STR_TO_DATE函数:
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)
hivapdat2#
您也可以使用CAST('2013-09-05T10:10:02Z' AS DATETIME),它不需要像STR_TO_DATE()那样定义格式。
CAST('2013-09-05T10:10:02Z' AS DATETIME)
STR_TO_DATE()
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)
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'我在查询中使用它之前,通过将值转换为@变量来修复它。下面是一个存储过程的例子:
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
ttygqcqt5#
这并不是你要求的格式,而是为了正确处理时区(例如'2023-06-06T13:00:00+07:00'),在MariaDB中使用此函数:
'2023-06-06T13:00:00+07:00'
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');将返回
SELECT ISO2UTC('2023-06-06T13:00:00+07:00');
2023-06-06 06:00:00
如所期望的。
5条答案
按热度按时间zpjtge221#
可以使用
STR_TO_DATE
函数:示例:
hivapdat2#
您也可以使用
CAST('2013-09-05T10:10:02Z' AS DATETIME)
,它不需要像STR_TO_DATE()
那样定义格式。rn0zuynd3#
如果你想处理时区,就使用这个查询,并使用mysqltimezone
或任何其他时区
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'
我在查询中使用它之前,通过将值转换为@变量来修复它。下面是一个存储过程的例子:
ttygqcqt5#
这并不是你要求的格式,而是为了正确处理时区(例如
'2023-06-06T13:00:00+07:00'
),在MariaDB中使用此函数:然后
SELECT ISO2UTC('2023-06-06T13:00:00+07:00');
将返回如所期望的。