SSIS 2008 脚本组件 DT_TIMESTAMP 到日期时间

SSIS 2008 SCript Component DT_TIMESTAMP to DateTime

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

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

然后在控制流中,我对记录集执行 ForEach 循环。 在其中我有一个映射到 DT_TIMESTAMP.

类型的 DateTime 变量

在 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

SSIS 中日期数据类型的最高精度是:

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

参考:

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

最准确的方法是将 2018-01-15 15:55:05.765 导入 varchar 变量。那么如果你需要在包中对变量进行date/time计算,将其转换为DT_DBTIMESTAMP2,它会保持2018-01-15 15:55:05.765的精确值。如果你需要将值插入到SQLServer中,将它作为DATETIME类型插入,你将得到2018-01-15 15:55:05.767的值。这是由于日期时间数据类型的限制。

来自 Microsoft: 日期时间值四舍五入为增量 .000、.003 或 .007 秒

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

我不确定你想用你的 foreach 循环做什么,但我建议你在你的原始数据流中做行级别的工作。

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