SSIS派生列字符串Concat多个日期表达式

时间:2014-09-03 23:04:06

标签: sql sql-server date ssis

解决方案 字面上必须对除了文字字符串之外的每个变量进行类型转换..哇..

(DT_STR,30,1252)( (DT_STR,3,1252)(DATEDIFF("mi", (DT_DATE)[fnTimeOut], (DT_DATE)[fnTimeIn])/1440) + ":" + (DT_STR,3,1252)(DATEDIFF("mi", (DT_DATE)[fnTimeOut], (DT_DATE)[fnTimeIn])/60) + ":" + (DT_STR,3,1252)(DATEDIFF("mi", (DT_DATE)[fnTimeOut], (DT_DATE)[fnTimeIn])%60) )


我正试图在SSIS(2012)中了解Derived Column表达式语法但是很难。我要做的是创建一个新列,它需要两个日期并找到它们之间的差异(DATEDIFF),但格式为DD:HH:MM。我知道我需要使用的公式,但根据编译器,我的语法很有用。

(DT_WSTR,100,1252)( (DATEDIFF("mi", [fnTimeOut], [fnTimeIn] )/1440) + ":" + (DATEDIFF("mi", [fnTimeOut] , [fnTimeIn])/60) + ":" + (DATEDIFF("mi", [fnTimeOut] , [fnTimeIn])%60) )

我尝试将DT_WSTR单独应用于所有3个DATEDIFF,但无济于事。谁能告诉我我的蠢事?

1 个答案:

答案 0 :(得分:1)

以下是在源SQL级别执行所需操作的示例:

SELECT C1, C2,
CONVERT(NVARCHAR(8),
    REPLACE(
        RIGHT(CONVERT(VARCHAR(16),C2-C1,120),8),
        ' ',':'
        ) 
) DDHHMM
FROM 
( 
  -- sample data 
  SELECT 
  CONVERT(DATETIME,'2014-01-01 09:15:07') C1, 
  CONVERT(DATETIME,'2014-01-01 15:37:02') C2
) F  

注意HHMMSS字段是NVARCHAR(SSIS语言中的DT_WSTR)。您确定要将数据存储为NVARCHAR,还是希望以更合适的格式(即DATETIME)存储,并稍后以某种方式格式化?

当差异超过一个月时,我不确定这个怎么样。这是你需要允许的东西吗?

如果您遇到DT_WSTR的麻烦,建议您确保目标表格为VARCHAR而不是NVARCHAR,并在源查询中投放到VARCHAR。它可以在DT_STRDT_WSTR

之间来回传输派生列内部的乱码

NVARCHAR是一种基本上存储外来字符的方式(它比那复杂得多,但基本知识)。如果您没有这个要求,请坚持使用VARCHAR。

SSIS派生的列任务通常是完全不必要的,因为数据可以在源SQL查询中转换回来,而且需要担心的是一小部分元数据。