首页 > 解决方案 > DT_DBTIMESTAMP2 只有 3 位数字

问题描述

(DT_DBTIMESTAMP2,7)GETDATE()在 SSIS 派生列转换和带有 datetime2(7) 的表列中。即使我在两者中都设置了 7 位数秒刻度,但似乎它只有 3 位数。例如,我预计像“2018-05-02 16:45:15.6192346”,但它是“2018-05-02 16:45:15.6190000 ”。

我需要毫秒的原因,我想使用时间戳从任何重复中整理出最新记录。我意识到只有 3 位数的秒刻度是不够的。

除了派生列转换和表列之外,SSIS 包中是否有任何必需的设置?任何建议将不胜感激。

标签: sql-serverssisrownum

解决方案


尽管这与 HoneyBadger 所说的几乎相同,但我正在扩展一点,因为 OP 没有使用GETDATE()SQL Server 中的表达式。2018-05-02 16:45:15.619(Transact-SQL)永远无法返回该值,GETDATE()因为它只能精确到 1/300 秒(因此最后一个数字只能是 0、3 和 7(技术上是 0、333333333~ 和 666666666~,即为什么最后一个数字是 7,因为它是四舍五入的))。

在 SSIS 中,GETDATE()表达式返回的数据类型为DB_TIMESTAMP. 根据文档

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

因此,最后 4 个字符丢失。不幸的是,我不相信 SSIS 中有一个函数可以将当前日期和时间返回到您需要的精度。因此,如果您需要这种高级别的,您可能需要使用 SQL Server 中的表达式,例如SYSDATETIME()HoneyBadger 推荐的。


推荐阅读