【问题标题】:Convert numeric(32,0) to DATETIME in SSIS job在 SSIS 作业中将 numeric(32,0) 转换为 DATETIME
【发布时间】:2019-07-25 16:46:07
【问题描述】:

我的数据源给了我一个numeric(32,0) 类型的列,它是纪元值,我想在我的数据库中将它转换为DATETIME。我有一个派生列转换,对于表达式,我尝试这样做:

DATEADD("SECOND", CAST([Last Modified Date] AS BIGINT) / 1000, (DT_DBTIMESTAMP)"1970-01-01")

但它给了我解析错误。有人可以帮我使用正确的语法吗?如果我不引用 "SECOND",那么它会立即告诉我 SECOND 不是输入列。

即使输入是 numeric(32,0) 类型,它们都是整数值,例如 1564371486110。

【问题讨论】:

    标签: sql-server ssis expression etl derived-column


    【解决方案1】:

    我不立即了解您的演员表并除以 1000。

    SSMS

    select datediff(ss,  '1970-01-01 00:00:00', getdate())
    1564069434
    

    表达式

    dateadd("SS", 1564069434, (DT_DBTIMESTAMP)"1970-01-01 00:00:00")
    2019-07-25 15:51:17.763
    

    编辑 - 我将假设您在纪元时间除以毫秒。

    派生列转换编辑器 - 表达式

     DATEADD("SS",(DT_UI8)SUBSTRING((DT_WSTR,32)epochtime,1,LEN(TRIM((DT_WSTR,32)epochtime)) - 3),(DT_DBTIMESTAMP)"1970-01-01 00:00:00")
    

    【讨论】:

    • 是的,我有几毫秒 :) 当我硬编码一个可以工作的数字时,但我无法让它与我的输入列一起工作。解析器给我一个错误,说它可能包含无效的标记、不完整的标记或无效的元素。
    • @Gargoyle 可以尝试将其引入 / 将其转换为字符串,以毫秒为子字符串而不是分割,然后将其转换为 bigint / DT_UI8 之类的东西。以后可以自己尝试一下,如果有效就更新。顺便说一句,您有什么示例值,您可以将其添加到问题中吗?
    • 1564371486110 就是一个例子。
    • @Gargoyle 尝试 - DATEADD("SS",(DT_UI8)SUBSTRING((DT_WSTR,32)epochtime,1,LEN(TRIM((DT_WSTR,32)epochcolumnthatisnumeric32)) - 3),(DT_DBTIMESTAMP )"1970-01-01 00:00:00")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多