T-SQL CURRENT_TIMESTAMP行为

时间:2016-11-25 12:38:39

标签: sql sql-server tsql datetime casting

我有:

select convert(int, CURRENT_TIMESTAMP, 121)  AS shipmentCode

有了这个,我假装给一批产品也提供一个独特的代码,其中也包含一些信息(这意味着我可以将代码转换回时间并保存货件的完整日期/小时)

但我希望在每次执行程序时,shipmentCode中的int都会改变,而不是。

但如果我这样做:

 select convert(varchar(255), CURRENT_TIMESTAMP, 121)  AS shipmentCode

varchar随时间变化。因为我需要代码是一个数字:

有人可以解释为什么会这样吗?

实现我需要的任何替代方案?

3 个答案:

答案 0 :(得分:2)

您假设CURRENT_TIMESTAMP中的值保持为int值。如果您实际上从更精确的数据类型开始,您将看到差异:

select convert(int, CURRENT_TIMESTAMP, 121)  AS shipmentCode

返回:42698

select convert(varchar(255), CURRENT_TIMESTAMP, 121)  AS shipmentCode

返回:2016-11-25 12:46:58.877

select convert(float, CURRENT_TIMESTAMP, 121)  AS shipmentCode

返回: 42697.5326258873 - 请注意此处的小数精度。

如果你想返回一个有意义的单个数字作为你的ID,我建议使用sysdatetime(它返回一个非常精确的datetime2)到每行创建一个唯一记录所需的精度,您可以通过多种方式进行格式化,例如相当麻烦:

select replace(replace(replace(replace(convert(nvarchar(25),sysdatetime(),121),' ',''),':',''),'-',''),'.','')

返回:201611251246588791305,格式为yyyyMMddhhmmssfffffff

答案 1 :(得分:1)

这比完整日期/时间转换更短更快,不需要从字符串转换:

选择转换(float,current_timestamp,121)* 10000000000 AS shipmentCode

答案 2 :(得分:0)

试试这个:SELECT DATEDIFF(SECOND,'1990-1-1',GETDATE())