DT_DBTIMESTAMP2只有3位数

时间:2018-05-02 07:57:09

标签: sql-server ssis rownum

我在SSIS派生列转换中使用(DT_DBTIMESTAMP2,7)GETDATE(),在datetime2(7)中使用表列。 虽然我在两者中都设置了7位数秒,但似乎只有3位数。 例如,我期望像' 2018-05-02 16:45:15.6192346' 但它来自' 2018-05-02 16:45: 15.6190000 '

我之所以需要毫秒,我想要使用时间戳来解决任何重复的最新记录。我意识到只有3位二次刻度才足以满足这种需求。

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

2 个答案:

答案 0 :(得分:1)

GETDATE()返回datetime,您应该使用SYSDATETIME()代替DT_DBTIMESTAMP。请参阅documentation

修改

如Larnu所述,您可能正在使用SSIS表达式GETDATE,而不是我假设的sql表达式GETDATE。尽管如此,这一点大致相同。 GETDATE返回{{1}},其中"小数秒的最大比例为3位数。" (Source)。

答案 1 :(得分:1)

尽管这与HoneyBadger所说的几乎相同,但由于OP未使用SQL Server中的GETDATE()表达式,因此我稍微扩展了一点。 2018-05-02 16:45:15.619(Transact-SQL)永远不会返回值GETDATE(),因为它只能精确到1/300秒(因此最后的数字只能是0,3,和7(技术上为0,3333333333~和666666666~,这就是为什么最后的数字是7,因为它被四舍五入))。

在SSIS中,GETDATE()表达式返回DB_TIMESTAMP的数据类型。根据{{​​3}}:

  

时间戳结构,包括年,月,日,小时,分钟,   秒,小数秒。小数秒有一个最大值   3位数。

因此,最后4个字符丢失。遗憾的是,我不相信SSIS中有一项功能会将当前日期和时间返回到您所需的准确度。因此,如果您需要这个高级别,您可能需要在SQL Server中使用表达式,例如HoneyBadger建议的Documentation