在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'
。它是破折号,而不是斜线。
如何更改表达式以满足此要求?
答案 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]
这会建立您的日期。第二行增加了时间部分。