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:00
是1900-01-00 00:01:00
但25:00
和178:29
分别是1900-01-01 01:00
和1900-01-07 10:29
。因此,您最好先将该值作为日期导入。
哦,它是一个CSV文件,然后将它作为文本导入。然后你可以把小时/分钟/秒分成几个部分,这很简单。
我认为你没有理解这个问题。
@SBA 178:29:00
是持续时间,而不是时间。 SQL Server 没有持续时间类型。 time
类型用于保存一天中的时间,不能接受高于 24:00 的值。您必须将此类型作为其他内容导入,但首先您必须决定如何存储它。您不能使用time
或datetime2
。在 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))
这是不检查是否存在无效值,您仍然必须这样做。
我还假设 minute
和 second
部分总是 2 位数长
【讨论】:
如果持续时间少于 1 小时,这将不起作用 @PanagiotisKanavosdeclare @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