SSIS HH::MM:SS 到秒,HH 部分在 SSIS 中超过 24

Posted

技术标签:

【中文标题】SSIS HH::MM:SS 到秒,HH 部分在 SSIS 中超过 24【英文标题】:SSIS HH::MM:SS to seconds with the HH part being more than 24 in SSIS 【发布时间】:2022-01-22 01:59:11 【问题描述】:

我正在尝试创建一个 SSIS 派生列,它将 HH:MM:SS 从平面文件转换为数据库中的几秒钟。

我遇到但似乎不知道如何上网的问题是当 HH 超过 24 岁时。

例如,其中一个 csv 文件具有 178:29:00。

我在 24 小时以下时使用 (DT_NUMERIC,10,2)(((DT_I4)SUBSTRING([SPEED OF ANSWER],1,2) * 3600) + ((DT_I4)SUBSTRING([SPEED OF ANSWER],4,2) * 60) + ((DT_NUMERIC,4,2)RIGHT([SPEED OF ANSWER],2)))

但是如果超过 24 岁就不行了。

【问题讨论】:

如果我没记错的话,Excel 实际上没有“时间”字段,只有日期和时间。时间值但在24:00:00 之后的值实际上只是1900-01-00 之后的日期。所以01:001900-01-00 00:01:0025:00178:29 分别是1900-01-01 01:001900-01-07 10:29。因此,您最好先将该值作为日期导入。 哦,它是一个CSV文件,然后将它作为文本导入。然后你可以把小时/分钟/秒分成几个部分,这很简单。 我认为你没有理解这个问题。 @SBA 178:29:00 是持续时间,而不是时间。 SQL Server 没有持续时间类型。 time 类型用于保存一天中的时间,不能接受高于 24:00 的值。您必须将此类型作为其他内容导入,但首先您必须决定如何存储它。您不能使用timedatetime2。在 C# 中,您可以使用 TimeSpan,但在 SQL Server 中没有等效项 如果您真的想节省几秒钟,您可以添加一个脚本转换,将文本解析为 TimeSpan 然后返回TimeSpan.TotalSeconds。这避免了容易出错的字符串操作,并且可以轻松处理小于 1 小时的值 【参考方案1】:

这是一个脚本组件。

string time = row.YourTimeRowAsString;

var t = time.Split(':');

int secs = 0;
switch(t.length)

    case 0:
        break;
    case 1:
        secs = int.Parse(t[0]);
        break;
    case 2:
        secs = 60* int.Parse(t[0]) + int.Parse(t[1]);
        break;
    case 3:
        secs = 60*60*int.Parse(t[0]) + 60*int.Parse(t[1]) + int.Parse(t[2]);
        break;

【讨论】:

可以使用TimeSpan.Parse直接解析字符串。在 C# 中无需拆分 很高兴我回答这个问题只是为了学习一个新的更好的解决方案。 #永远在学习。【参考方案2】:

一种方法是将 varchar 拆分为不同的值,然后将它们相加。 您在代码中做错的是您没有考虑小时部分的位数。 这是一个关于如何做到这一点的示例,该示例使用 SQL,因为我不太了解 ssis。 希望对你有帮助

declare @s varchar(20) = '178:29:00'

select convert(int, left(@s, charindex(':', @s) - 1)) * 3600 +
       convert(int, substring(@s, charindex(':', @s) + 1, 2)) * 60 +
       convert(int, right(@s, 2))

这是不检查是否存在无效值,您仍然必须这样做。 我还假设 minutesecond 部分总是 2 位数长

【讨论】:

如果持续时间少于 1 小时,这将不起作用 @PanagiotisKanavos declare @s varchar(20) = '00:29:00' 将返回 1740,那么为什么它不起作用?你能解释一下吗 您假设00: 将可用。您发布的代码在 SQL 中与 OP 已经发布的代码等效 @PanagiotisKanavos 是的,我认为至少会有一个 0 出现几个小时。我的代码和来自 OP 的代码的不同之处在于,他的代码仅在存在确切的 2 位数字时才有效,而我的代码在至少存在一位数字时才有效 @PanagiotisKanavos 所以我的代码也可以使用超过 2 位的数小时

以上是关于SSIS HH::MM:SS 到秒,HH 部分在 SSIS 中超过 24的主要内容,如果未能解决你的问题,请参考以下文章

时间戳(精确到毫秒)转yyyy-mm-dd hh:mm:ss

在 SQL Server 中将 varchar 'hh:mm:ss' 转换为 datetime hh:mm:ss

将 hh:mm:ss.00 向上舍入为 hh:mm:ss

YYYY-mm-dd HH:MM:SS

yyyy-MM-dd HH:mm:ss

如何从两个纪元时间戳计算 hh:mm:ss 中 hh:mm:ss 的差异?