2016-06-07 84 views
3

我想排名一系列交易,但是我的源數據並沒有捕獲一天可能發生多次的交易時間,我唯一可以使用的其他字段是timestamp字段 - 這將排名是否正確?使用時間戳和日期時間的TSQL排名

下面的代碼

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

您可以使用這樣的事情來獲得交易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 

並將其用於排名。

+0

我明白答案,但upvote很好奇。 OP很清楚地表明日期欄中沒有時間分量。 –

+0

'TimeStamp'上沒有'TrnDate',而是'SELECT CAST(0x0000000000500AB9 as datetime)'給出了這個:'1900-01-01 04:51:25.417'。 – gofr1

+0

我應該補充說,將'timestamp' /'rowversion'視爲實際的日期,時間或日期時間值在SQL Server中顯然是一個壞主意。 upvotes從哪裏來? –

3

首先,您應該使用rowversion而不是timestamp來跟蹤行版本信息。我相信timestamp已被棄用。至少,文件明確建議[rowversion][1]

其次,我強烈建議你在表中添加一個標識列。這將提供您真正需要的信息 - 以及表格的一個很好的唯一鍵。

通常,timestamprowversion僅用於確定行是否已更改 - 不確定排序。但是,在此基礎上的描述,你在做什麼可能是正確的:

每個數據庫都有一個遞增爲包含內部的一個 時間戳列是對錶執行的每個插入或 更新操作計數器數據庫。該計數器是數據庫 時間戳。這跟蹤數據庫中的相對時間,而不是可以與時鐘關聯的實際時間。一個表格只能有一個時間戳列 。每當具有時間戳列的行爲 修改或插入時,增加的數據庫時間戳值將插入時間戳記列中的 。

我會提醒的是,這可能不安全。相反,它給出了這種方法可能有意義的原因。讓我重複一下這個建議:添加一個標識列,以便您至少在將來能夠正確添加此信息。

+0

不幸的是,我不能更改源數據表,因爲這是超出我的範圍,否則您的建議將是理想的 –