У меня есть:

select convert(int, CURRENT_TIMESTAMP, 121)  AS shipmentCode

При этом я делаю вид, что даю уникальный код партии товаров, в которой также содержится некоторая информация (это означает, что я могу преобразовать код обратно во времени и получить полную дату / час доставки)

Но я ожидаю, что int в shipmentCode будет меняться каждый раз, когда я выполняю процедуру, а это не так.

Но если я сделаю:

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

Varchar меняется со временем. Поскольку мне нужно, чтобы код был числом:

Может кто-нибудь объяснить, почему это происходит?

Есть ли альтернативы для достижения того, что мне нужно?

-1
Miguel Mas 25 Ноя 2016 в 15:38

3 ответа

Лучший ответ

Попробуйте это: SELECT DATEDIFF(SECOND,'1990-1-1',GETDATE())

0
Mansoor 25 Ноя 2016 в 12:48

Вы предполагаете, что значение в 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 - обратите внимание на десятичную точность.

Если вы хотите вернуть значимое единственное число в качестве своего идентификатора, я бы рекомендовал использовать sysdatetime (который возвращает очень точное datetime2) с любой точностью, необходимой для создания уникальной записи для каждой строки, которую вы можете форматировать несколькими способами, например довольно громоздким:

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

Что возвращает: 201611251246588791305 в формате yyyyMMddhhmmssfffffff

2
iamdave 25 Ноя 2016 в 12:53

Это короче и быстрее, чем полный перевод даты / времени, и не требует преобразования из строки:

Выберите convert (float, current_timestamp, 121) * 10000000000 AS shipmentCode

1
cloudsafe 25 Ноя 2016 в 13:02