【问题标题】:SSIS HH::MM:SS to seconds with the HH part being more than 24 in SSISSSIS HH::MM:SS 到秒,HH 部分在 SSIS 中超过 24
【发布时间】: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 小时的值

标签: sql-server ssis ssis-2012


【解决方案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 位的数小时
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
相关资源
最近更新 更多