数据库:如何对GUID进行排序?

时间:2011-10-19 02:45:42

标签: c# sql-server database sql-server-2008 database-design

我的主键使用guid。

如何对GUID进行排序?

我创建一个datetime列并记录一个日期时间戳,然后我可以按日期时间排序?这是最好的方法吗?还是有更好的方法?

5 个答案:

答案 0 :(得分:2)

SELECT * 
FROM myTable
ORDER BY CAST(myGuid AS VARCHAR(36))

答案 1 :(得分:1)

Guid就是名称所暗示的,一个唯一的标识符。身份并不意味着秩序,它只是给你一种方法来确定两件事是否应该是相同的。为了进行排序,您需要确定它比其他更大或更严重的含义。从您的问题来看,似乎排序应该基于创建时间; Guids不会帮助你。

答案 2 :(得分:0)

我会将int(或bigint)列设置为标识。每次插入一行时,标识都会递增。您可以对此列进行排序,以按插入顺序获取行。

答案 3 :(得分:0)

你想做什么?按插入日期排序?因为你确实需要一个日期时间(或其中一个变体)字段,因为guids和auto incr键永远不能保证顺序,只有唯一性

阅读本文以获取更多信息:Primary Key Sorting

答案 4 :(得分:0)

Necromancing。
GUID只是随机数,它们没有顺序性(除非你使用sequentialuid - 但它会在计算机重新启动后重新启动,所以它几乎没有意义)。
这就是GUID实际排序的方式:
代码说明了自己,神奇的部分是:

Animal

完整代码:

System.Guid g
g.ToByteArray();
int[] m_byteOrder = new int[16] // 16 Bytes = 128 Bit 
    {10, 11, 12, 13, 14, 15, 8, 9, 6, 7, 4, 5, 0, 1, 2, 3};


public int Compare(Guid x, Guid y)
{
    byte byte1, byte2;

    //Swap to the correct order to be compared
    for (int i = 0; i < NUM_BYTES_IN_GUID; i++)
    {
        byte1 = x.ToByteArray()[m_byteOrder[i]];
        byte2 = y.ToByteArray()[m_byteOrder[i]];
        if (byte1 != byte2)
            return (byte1 < byte2) ? (int)EComparison.LT : (int)EComparison.GT;
    } // Next i 

    return (int)EComparison.EQ;
}