生成唯一编号

时间:2016-05-01 09:28:55

标签: sql sql-server datetime numbers unique

我有一个SQL查询

select substring(
            replace(
                replace(
                    replace(
                        replace(
                            convert(varchar,sysdatetime(),121),
                        '-',''),
                    ' ',''),
                ':',''),
            '.','')
        ,1,18) as DATETIME

它生成18位数字当前数字,如201605011221374719

如何更改此查询以生成11位唯一数字?

4 个答案:

答案 0 :(得分:0)

只需在查询中替换18到11:

select substring(replace(replace(replace(replace(convert(varchar,sysdatetime(),121),'-',''),' ',''),':',''),'.',''),1,11) as DATETIME

答案 1 :(得分:0)

我希望围绕span的{​​{1}}函数可以实现您的需求。

尝试以下查询

right()

答案 2 :(得分:0)

NEWID()对你不起作用?它是独一无二的,但比你所要求的数字更多。

你可以使用NEWID(),然后只取前11位数字(不确定这是否足够独特)。

select right(cast(rand(checksum(newid())) as decimal(15, 15)), 11)

https://msdn.microsoft.com/en-us/library/ms190348.aspx

答案 3 :(得分:0)

如果您使用的是sql server 2012或更高版本,则可以使用内置的FORMAT功能:

--                            123456789-12345678
SELECT FORMAT(SYSDATETIME(), 'yyyyMMddHHmmssffff') -- 18 digits
SELECT FORMAT(SYSDATETIME(), 'dHHmmssffff') -- 11 digits

对于早期版本(2008 r2及更低版本),您只需更改子字符串的值 - 从第8个字符获取子字符串:

select substring(
            replace(
                replace(
                    replace(
                        replace(
                            convert(varchar,sysdatetime(),121),
                        '-',''),
                    ' ',''),
                ':',''),
            '.','')
        ,8,11) as DATETIME

请注意,通过减少位数,您也会减少数字的唯一性 - 而18位数在下一个10000年内是唯一的,11位数只是唯一的10天。更改为12位数将使其每月独一无二,并且更改为14位数将使其每年独一无二。