gpt4 book ai didi

MySQL - 将 ISO-8601 持续时间转换为 DATE_ADD 的间隔

转载 作者:行者123 更新时间:2023-12-01 06:03:55 24 4
gpt4 key购买 nike

我在数据库中存储了两个字段,其中一个包含日期时间,另一个包含表示 ISO-8601 格式(例如“P1MT2H”)的持续时间的字符串。我希望能够将持续时间添加到 SQL 中的日期时间列,似乎我应该能够使用 DATE_ADD 来做到这一点。但是不知道有没有什么好的方法可以转换成区间。如果可能的话,我宁愿不必定义自己的 sql 函数来解析间隔。

最佳答案

我仍然很想听到这个问题的一些很好的答案,但目前,我已经创建了一个函数来做到这一点。我添加了第三个可选参数以在特定时区运行计算。这不是一个通用的解决方案,但我希望它能让其他人走上正轨。

CREATE FUNCTION ADD_ISO_DURATION(StartDate DATETIME, Duration VARCHAR(45), Timezone VARCHAR(45))
RETURNS DATETIME
BEGIN
DECLARE TimeStr VARCHAR(45) DEFAULT '';
DECLARE Pos INTEGER;

IF StartDate IS NULL OR Duration IS NULL OR LENGTH(Duration) = 0 THEN
RETURN StartDate;
END IF;

IF Timezone IS NOT NULL THEN SET StartDate = CONVERT_TZ(StartDate, 'UTC', Timezone); END IF;

IF Duration REGEXP '^P[0-9]+W$' THEN
SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(Duration, 2, LENGTH(Duration) - 2) WEEK);
RETURN IF(Timezone IS NULL, StartDate, CONVERT_TZ(StartDate, Timezone, 'UTC'));
END IF;

IF Duration NOT REGEXP '^P([0-9]+Y)?([0-9]+M)?([0-9]+D)?(T([0-9]+H)?([0-9]+M)?([0-9]+S)?)?$' THEN
RETURN NULL;
END IF;

SET Pos = LOCATE('T', Duration);
IF Pos <> 0 THEN
SET TimeStr = SUBSTR(Duration, Pos + 1);
SET Duration = SUBSTR(Duration, 2, Pos);
ELSE
SET Duration = SUBSTR(Duration, 2);
END IF ;

SET Pos = LOCATE('Y', Duration);
IF Pos <> 0 THEN
SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(Duration, 1, Pos - 1) YEAR);
SET Duration = SUBSTR(Duration, Pos + 1);
END IF;

SET Pos = LOCATE('M', Duration);
IF Pos <> 0 THEN
SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(Duration, 1, Pos - 1) MONTH);
SET Duration = SUBSTR(Duration, Pos + 1);
END IF;

SET Pos = LOCATE('D', Duration);
IF Pos <> 0 THEN
SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(Duration, 1, Pos - 1) DAY);
END IF;

IF LENGTH(TimeStr) <> 0 THEN
SET Pos = LOCATE('H', TimeStr);
IF Pos <> 0 THEN
SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(TimeStr, 1, Pos - 1) HOUR);
SET TimeStr = SUBSTR(TimeStr, Pos + 1);
END IF;

SET Pos = LOCATE('M', TimeStr);
IF Pos <> 0 THEN
SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(TimeStr, 1, Pos - 1) MINUTE);
SET TimeStr = SUBSTR(TimeStr, Pos + 1);
END IF;

SET Pos = LOCATE('S', TimeStr);
IF Pos <> 0 THEN
SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(TimeStr, 1, Pos - 1) SECOND);
SET TimeStr = SUBSTR(TimeStr, Pos + 1);
END IF;
END IF ;

RETURN IF(Timezone IS NULL, StartDate, CONVERT_TZ(StartDate, Timezone, 'UTC'));
END $$

关于MySQL - 将 ISO-8601 持续时间转换为 DATE_ADD 的间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42079380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com