gpt4 book ai didi

php - 如何将 SCORM 2004 session_time 格式转换为 SQL 中可用的日期时间格式

转载 作者:搜寻专家 更新时间:2023-10-31 20:43:04 24 4
gpt4 key购买 nike

所以 SCORM 2004 的 session_time 格式如下所示

P[yY][mM][dD][T[hH][mM][s[.s]S]]

其中方括号中的选项是可选的,但它必须至少包含一个选项。

格式示例为 PT0H0M47S

这意味着 0 小时 0 分 47 秒。

该值在 MSSQL 数据库中存储为 varchar。

我需要能够将此字符串格式转换为可用格式,以便我可以将此时间添加到开始日期时间以计算出结束日期时间。

我目前正在将 SCORM 数据从旧数据库移动到新数据库 1。我可以用 PHP 执行此操作并轻松设置时间格式,但我更愿意用 SQL 编写所有导入脚本。

如有任何帮助,我们将不胜感激。

编辑:

如果有帮助,这是我编写的用于处理格式的 PHP 函数用于其他目的

private function formatDuration($duration)
{
$count = preg_match('/P(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)D)?T?(([0-9]+)H)?(([0-9]+)M)?(([0-9]+)(\.[0-9]+)?S)?/', $duration, $matches);

if ($count)
{
$_years = (int) $matches[2];
$_months = (int) $matches[4];
$_days = (int) $matches[6];
$_hours = (int) $matches[8];
$_minutes = (int) $matches[10];
$_seconds = (int) $matches[12];
}
else
{
if (strstr($duration, ':'))
{
list($_hours, $_minutes, $_seconds) = explode(':', $duration);
}
else
{
$_hours = 0;
$_minutes = 0;
$_seconds = 0;
}
}

// I just ignore years, months and days as it is unlikely that a
// course would take any longer than 1 hour
return $_seconds + (($_minutes + ($_hours * 60)) * 60);
}

最佳答案

刚刚为我制定了一个解决方案。

这需要为我放入一个 SQL 函数中,我需要完成最后一点我决定我想要的格式。

我只更新了大约 900 行,这是一次更新,所以性能不是问题。

DECLARE @session_time varchar(200) = 'P50Y2M3DT4H5M6S'

DECLARE @date varchar(100) = ''
DECLARE @time varchar(100) = ''

DECLARE @year varchar(20) = '0'
DECLARE @month varchar(20) = '0'
DECLARE @day varchar(20) = '0'
DECLARE @hour varchar(20) = '0'
DECLARE @minute varchar(20) = '0'
DECLARE @second varchar(20) = '0'

-- Remove the P
SET @session_time = SUBSTRING(@session_time, 2, LEN(@session_time)-1)

-- If we have a T
IF PATINDEX('%T%',@session_time) > 0
BEGIN
SET @date = SUBSTRING(@session_time, 0, PATINDEX('%T%',@session_time))

SET @time = SUBSTRING(@session_time, LEN(@date + 'T') + 1, LEN(@session_time))
END
ELSE
BEGIN
SET @time = @session_time;
END

-- Get the date parts
IF LEN(@date) > 0
BEGIN
-- If theres a year
IF PATINDEX('%Y%',@date) > 0
BEGIN
SET @year = SUBSTRING(@date, 0, PATINDEX('%Y%',@date))

SET @date = SUBSTRING(@date, LEN(@year + 'Y') + 1, LEN(@date))
END

-- If theres a month
IF PATINDEX('%M%',@date) > 0
BEGIN
SET @month = SUBSTRING(@date, 0, PATINDEX('%M%',@date))

SET @date = SUBSTRING(@date, LEN(@month + 'M') + 1, LEN(@date))
END

-- If theres a day
IF PATINDEX('%D%',@date) > 0
BEGIN
SET @day = SUBSTRING(@date, 0, PATINDEX('%D%',@date))

SET @date = SUBSTRING(@date, LEN(@day + 'D') + 1, LEN(@date))
END
END

-- Get the time parts
IF LEN(@time) > 0
BEGIN
-- If theres an hour
IF PATINDEX('%H%',@time) > 0
BEGIN
SET @hour = SUBSTRING(@time, 0, PATINDEX('%H%',@time))

SET @time = SUBSTRING(@time, LEN(@hour + 'H') + 1, LEN(@time))
END

-- If theres a minute
IF PATINDEX('%M%',@time) > 0
BEGIN
SET @minute = SUBSTRING(@time, 0, PATINDEX('%M%',@time))

SET @time = SUBSTRING(@time, LEN(@minute + 'M') + 1, LEN(@time))
END

-- If theres a second
IF PATINDEX('%S%',@time) > 0
BEGIN
SET @second = SUBSTRING(@time, 0, PATINDEX('%S%',@time))

SET @time = SUBSTRING(@time, LEN(@second + 'S') + 1, LEN(@time))
END
END

PRINT @year + ' years '
PRINT @month + ' months '
PRINT @day + ' days '
PRINT @hour + ' hours '
PRINT @minute + ' minutes '
PRINT @second + ' seconds '

关于php - 如何将 SCORM 2004 session_time 格式转换为 SQL 中可用的日期时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18128145/

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