2014-09-03 54 views
0

解决方案 从字面上看有强制转换除文字字符串..哇每一个变量..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小号单独无济于事。任何人都可以告诉我我该死的东西吗?

+0

SSIS表达式编辑器是跛脚的。我建议您在源查询中预先计算结果并将结果添加为额外的列。然后你可以实时检查你的结果 – 2014-09-04 00:28:17

+0

它只是比你想象的更强类型。我会采取,而不是它不显示错误。 – TMNT2014 2014-09-04 15:18:20

回答

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场(在SSIS语言DT_WSTR)一NVARCHAR。您是否确定要将数据存储为NVARCHAR或者您是否希望以更合适的格式存储它(即DATETIME),并且稍后将其格式化为某种方式?

我不确定当差异超过一个月时这个工作方式是如何工作的。这是你需要考虑的吗?

如果您有DT_WSTR麻烦,我建议你确保你的目标表是VARCHAR而不是NVARCHAR,并转换为VARCHAR在你的源查询。这样可以节省在派生列铸造搞乱来回DT_STRDT_WSTR之间的负载

NVARCHAR是基本存储外国字符(它比这更复杂,但多数民众赞成在基础)的方式。如果你没有这个要求,坚持VARCHAR。

很多时候,SSIS派生列任务完全是不必要的,因为数据可以在源SQL查询中转换回来,并且它是少一部分需要担心的元数据。

+0

我正在考虑这样做,但不想过度复杂化流程流程,所以我只是使用上面的表达式。是的,我确定我想用varchar,因为这种格式可以考虑超过24小时的持续时间,因为它包含了日期。刚刚阅读您的编辑,我实际上在我的目的地有一个错误。不能在Unicode和非Unicode字符串之间进行转换。将目标中的列的数据类型更改为NVARCHAR会改正问题吗? – Rook 2014-09-04 01:04:58

+0

我以为目的地已经是NVARCHAR。你是说它是VARCHAR吗?如果是这样,将'CONVERT(NVARCHAR(8),'改为'CONVERT(VARCHAR(8))',看看是否有帮助。在我看来,数据库中的逻辑越多,包装越简单。 ...只是我的意见 – 2014-09-04 12:43:37

+0

最后只是在SQL Level上做了这件事,让事情变得更加顺畅,不得不使用完全不同的SQL语句,但是你的SQL让我开始了。 – Rook 2014-09-08 04:37:51