解决方案 字面上必须对除了文字字符串之外的每个变量进行类型转换..哇..
(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 :(得分: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_STR
和DT_WSTR
NVARCHAR
是一种基本上存储外来字符的方式(它比那复杂得多,但基本知识)。如果您没有这个要求,请坚持使用VARCHAR。
SSIS派生的列任务通常是完全不必要的,因为数据可以在源SQL查询中转换回来,而且需要担心的是一小部分元数据。