更改SSIS表达式中的日期格式

时间:2016-10-13 14:37:06

标签: sql ssis

在SSIS中,我有一个表达式:

"SELECT _sessions.session_id AS session_id, _sessions.user_id AS user_id,
       _sessions.updated_at FROM public._sessions _sessions
        WHERE  _sessions.updated_at  > '"  +(DT_STR, 20, 1252)@[User::MaxId] + "'"

输出:

SELECT _sessions.session_id AS session_id,   _sessions.user_id AS user_id, 
       _sessions.updated_at FROM public._sessions _sessions
       WHERE  _sessions.updated_at  > '13/10/2016 11:58:00'

但是我需要输出日期:> '13-10-2016 11:58:00'。它是破折号,而不是斜线。

如何更改表达式以满足此要求?

2 个答案:

答案 0 :(得分:3)

在SSIS中,当您将DateTime类型转换为字符串时,它调用底层.NET对象的ToString()方法。这将使用您的本地化规则来生成字符串。

由于英国的本地化,你有dd / mm / yyyy hh:mm:ss。对于美国语言环境,我有mm / dd / yyyy等。

因此,如果您需要特殊格式,则必须自己构建。我正在使用StartTime,因为它使测试更容易,但假设MaxId也是日期时间类型,它是一个简单的替换

(DT_WSTR, 4) YEAR(@[System::StartTime]) 
+ "-" 
+ RIGHT("0" + (DT_WSTR, 2) MONTH(@[System::StartTime]),2) 
+ "-" 
+ RIGHT("0" + (DT_WSTR, 2) DAY(@[System::StartTime]),2)
+ " "
+ LEFT(RIGHT((DT_WSTR, 24) (@[System::StartTime]), 11), 9)

上面要注意的是,要获得日期和月份的前导零,我们在发出的字符串前面加上前导零(对于3月,我们将有03,对于10月,它将是010)然后只保留尾随的2个字符。根据实际日期,这比条件逻辑更加清晰。

我采用惰性路径进行时间操作,因此我使用默认时间转换的最后11个字符来获取时间部分,然后在结束时剥离AM / PM修改器。

答案 1 :(得分:1)

您有日期DD-MM-YYYY的SSIS非标准格式。试试这个表达式

RIGHT("0" + (DT_STR, 2, 1252)DATEPART("dd", @[User::MaxId]), 2) + "-" + 
RIGHT("0" + (DT_STR, 2, 1252)DATEPART("mm", @[User::MaxId]), 2) + "-" + 
(DT_STR, 4, 1252)DATEPART("yyyy", @[User::MaxId]) +  
+ " " + (DT_STR, 8, 1252)(DT_DBTIME)@[User::MaxId]  

这会建立您的日期。第二行增加了时间部分。