【问题标题】:Generate Unique Number生成唯一编号
【发布时间】:2016-05-01 09:28:55
【问题描述】:

我有一个 SQL 查询

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

它正在生成 18 位当前号码,例如 201605011221374719

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

【问题讨论】:

  • 您使用的是什么版本的 sql server?
  • 您知道这不一定是唯一的,对吧?你需要什么 - 只是一个唯一的数字,任何类型,还是它也必须与当前日期做某事?

标签: sql sql-server datetime numbers unique


【解决方案1】:

只需将查询中的 18 替换为 11:

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

【讨论】:

  • 我想一次在 5 台计算机上运行此查询。所以我不会是独一无二的。我需要在其中输入秒和毫秒。我的意思是它会像这样 05(月)01(天)12(小时)40(分钟)30(秒)2145(毫秒)......或者我们可以检查当天的当前秒......我的意思是24 小时内有 86400 我可以从中选择当前秒
  • 请将此添加到问题中以使其更完整以及为什么需要 11 位唯一编号
【解决方案2】:

我希望sysdatetime() 周围的right() 函数可以实现你所需要的。

试试下面的查询

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

【讨论】:

【解决方案3】:

NEWID() 对您不起作用?它是唯一的,但位数比您要求的 11 多。

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

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

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

【讨论】:

  • 谢谢。我现在得到了解决方案
  • guid 的 newid() 的子串不必一直唯一
【解决方案4】:

如果您使用的是 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 位将使其每年唯一。

【讨论】:

    猜你喜欢
    • 2011-05-21
    • 2017-04-06
    • 2012-04-14
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多