我有:
select convert(int, CURRENT_TIMESTAMP, 121) AS shipmentCode
有了这个,我假装给一批产品也提供一个独特的代码,其中也包含一些信息(这意味着我可以将代码转换回时间并保存货件的完整日期/小时)
但我希望在每次执行程序时,shipmentCode中的int都会改变,而不是。
但如果我这样做:
select convert(varchar(255), CURRENT_TIMESTAMP, 121) AS shipmentCode
varchar随时间变化。因为我需要代码是一个数字:
有人可以解释为什么会这样吗?
实现我需要的任何替代方案?
答案 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())