【问题标题】:SSIS 2008 SCript Component DT_TIMESTAMP to DateTimeSSIS 2008 SCript 组件 DT_TIMESTAMP 到 DateTime
【发布时间】:2018-01-17 16:21:03
【问题描述】:

我正在读取 VB.net 脚本源组件中的文件列表以创建文件名列表和 LastWriteDate 以创建文件列表。 LastWriteDate 在脚本源中作为 DateTime 保存并输出到存储在目标 Recordset 中的 DT_DBTIMESTAMP

我在源和目标之间的数据流上放置了一个查看器,它显示DT_DBTIMESTAMP 的第一个文件的值为2018-01-15 15:55:05.765

然后,在控制流中,我在记录集上执行 ForEach 循环。 在其中我有一个 DateTime 类型的变量,它映射到 DT_TIMESTAMP

在 ForEach 内部,我有一个脚本组件,将 DT_TIMESTAMP 映射到组件中。 该组件将 DT_TIMESTAMP 检索到 DateTime 变量中,但将其存储为 1/15/2018 3:55:06 PM

不仅格式会改变,精度也会改变。 我对这里发生的事情有点困惑,但我认为DT_TIMESTAMP 中的完整日期和时间在我的第二个脚本中仍然可用,但我不清楚如何获取它。

有没有办法在我的脚本中设置 DateTime 变量以显示与DT_TIMESTAMP 相同的精度?也许我需要将接收脚本变量定义为 DateTime 以外的其他内容,即 DT_TIMESTAMP 等效项?

有没有办法防止脚本组件中的 DateTime 变量将 DT_TIMESTAMP 中的值四舍五入,以便将其转换为 1/15/2018 3:55:05 PM

【问题讨论】:

    标签: sql sql-server datetime ssis etl


    【解决方案1】:

    最准确的方法是将2018-01-15 15:55:05.765 导入到varchar 变量中。然后,如果您需要使用变量在包中进行日期/时间计算,请将其转换为 DT_DBTIMESTAMP2,它将保持2018-01-15 15:55:05.765 的确切值。如果您需要将该值插入 SQLServer,请将其作为DATETIME 类型插入,您将获得2018-01-15 15:55:05.767 的值。这是由于日期时间数据类型的限制。

    来自Microsoft: 日期时间值四舍五入为 0.000、0.003 或 0.007 秒的增量

    【讨论】:

      【解决方案2】:

      SSIS 中日期数据类型的最大精度为:

      DT_DBTIMESTAMP2 由年、月、日、小时、分钟、秒和小数秒组成的时间戳结构。小数秒的最大刻度为 7 位。

      参考:

      https://docs.microsoft.com/en-us/sql/integration-services/data-flow/integration-services-data-types

      【讨论】:

        【解决方案3】:

        我正在添加一个单独的答案,因为我认为这实际上可能有助于解决您的问题。另一个答案只是详细说明了数据类型的精度。

        我不确定您要尝试使用 foreach 循环做什么,但我建议您在原始数据流中进行行级工作。

        日期时间变量的最大精度是秒。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多