使用时间戳和日期时间的TSQL排名

时间:2016-06-07 10:54:31

标签: sql-server tsql sql-server-2012

我正在尝试对一系列交易进行排名,但是我的源数据并不捕获每天可能发生多次的交易时间,我可以使用的唯一其他字段是timestamp字段 - 这会被正确排名吗?

这是代码

SELECT [LT].[StockCode]
     , [LT].[Warehouse]
     , [LT].[Lot]
     , [LT].[Bin]
     , [LT].[TrnDate]
     , [LT].[TrnQuantity]
     , [LT].[TimeStamp] 
     , LotRanking = Rank() Over (Partition By [LT].[Warehouse],[LT].[StockCode],[LT].[Lot] Order By [LT].[TrnDate] Desc, [LT].[TimeStamp] Desc)
     From [LotTransactions] [LT]

返回的结果如下

StockCode   |Warehouse  |Lot    |Bin    |TrnDate                    |TrnQuantity    |TimeStamp          |LotRanking
2090        |CB         |3036   |CB     |2016-02-16 00:00:00.000    |2.000000       |0x0000000000500AB9 |1
2090        |CB         |3036   |CB     |2016-02-16 00:00:00.000    |2.000000       |0x0000000000500A4E |2

2 个答案:

答案 0 :(得分:3)

首先,您应该使用rowversion而不是timestamp来跟踪行版本控制信息。我相信timestamp已被弃用。至少,文档明确建议[rowversion][1]

其次,我强烈建议您向表中添加标识列。这将提供您真正需要的信息 - 以及该表的一个很好的唯一键。

通常,timestamprowversion仅用于确定行是否已更改 - 而不是确定排序。但是,根据这个描述,你正在做的可能是正确的:

  

每个数据库都有一个计数器,该计数器针对每个插入或递增   在包含a的表上执行的更新操作   数据库中的timestamp列。这个计数器是数据库   时间戳。这会跟踪数据库中的相对时间,而不是数据库   可以与时钟关联的实际时间。一张桌子只能有   一个时间戳列。每次带有timestamp列的行   修改或插入后,递增的数据库时间戳值为   插入时间戳列。

我要提醒一点,这可能不安全。相反,它给出了这种方法可能有意义的原因。让我重复一下建议:添加一个标识列,这样您就可以正确添加此信息,至少在将来是这样。

答案 1 :(得分:2)

你可以使用这样的东西获得交易的datetime

SELECT LEFT(CONVERT(nvarchar(50),[LT].[TrnDate],121),10) + RIGHT(CONVERT(nvarchar(50),CAST([LT].[TimeStamp] as datetime),121),13)

对于第一个字符串,它将是:

2016-02-16 04:51:25.417

并将其用于排名。