2008-10-07 64 views
11

我需要一個從表中選擇的列,它沒有列告知何時行被插入,只有timestamp列(值如:0x0000000000530278)。 ?一些數據導入到表昨天,現在我需要找出究竟是進口:(有沒有辦法從時間戳類型列中獲取日期時間值?

有沒有辦法只使用timestamp信息做Here我發現:

  • 時間戳是一個8個字節順序六角數,也無關既沒有日期也沒有時間
  • 要獲得時間戳的當前值,使用:@@ DBTS

或許有找到一種方法什麼是timestamp特定時間周圍的價值?這將有助於形成一個選擇。或者,也許有一個衆所周知的解決方案?

回答

19

Transact-SQL時間戳數據類型是一種二進制數據類型,沒有時間相關的值。

所以要回答你的問題:有沒有辦法從時間戳類型列獲取日期時間值?

答案是:沒有

9

SQL Server 2005中的timestamp數據類型是rowversion的同義詞,僅僅是一個隨每行更新而自動遞增的數字。

您可以將其轉換爲bigint以查看其值。

要獲得您想要的新行或更新行,您應該添加另一個日期時間列(lastupdate)和一個觸發器,以便在每次更新時更新該列。

對於過去已插入的行,我不認爲您可以做一些事情來找到確切的時間。

+0

解釋了timestamp列的類型,但未回答我的問題: – Dandikas 2008-10-07 11:11:52

0

我認爲你最好的選擇是從插入之前恢復備份,並將備份表與當前表進行比較。

3

恐怕無法將TIMESTAMP轉換/轉換爲DATETIME。 他們有完全不同的用法和實現不兼容。

請參閱此鏈接 http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

圖書網上也說http://msdn.microsoft.com/en-us/library/aa260631.aspx

的SQL Server時間戳數據類型 無關,與時間或日期。 SQL 服務器時間戳是二進制數 ,它們指示 中的相對序列,其中數據修改發生在 數據庫中。時間戳數據類型 最初實現爲支持 SQL Server恢復算法。

+0

也許有一種方法可以找到特定時間周圍的時間戳值?導入是一個後面的事情,所以時間差距很大(不需要精確度) – Dandikas 2008-10-07 11:40:51

3

另一個回答你的問題:

如果時間戳列是你恢復的唯一資源(無備份等),你可以嘗試使用下面的邏輯

時間戳僅僅是被增量是在包含時間戳列一個表來執行每個插入或更新操作的計數器的值。

如果數據導入所發生昨天的幾條記錄一個插入,你可能會看到數字的序列中的時間戳列象例如:

0x00000000000007D1 
0x00000000000007D2 
0x00000000000007D3 
0x00000000000007D4 
0x00000000000007D5 

最新的時序可以讓您的數據(當然它不是guarantied) 如果你使用它們),以確定您所感興趣的記錄您CON結合了其他的東西,知識(如自動增量列。

0

要通過時間戳確定新行,你需要保持跟蹤預先在那裏的時間戳。在一個捏你可以:

  • 恢復以前的版本別的地方。
  • 將兩個表中的數據複製到臨時數據庫中。
  • 從一個存在的時間戳中識別插入的數據,但另一個不存在。

如果在數據庫中發生了其他任何事情,就會有小的誤報風險,這會給您帶來相當不錯的區別。

對於一個更強大的檢查,你可以計算MD5或SHA-1散列與Hashbytes對行的內容,爲您帶來碰撞的概率非常低的差異(見這個問題的討論Birthday attacks這個維基百科文章) 。

0

我知道這太晚了,但可能會幫助別人。

時間戳/ RowVersion可以輸出到BigInt,但無論如何它不能與日期時間進行比較。

下面的語句從MSDN

採取的的Transact-SQL rowversion數據類型不是日期或時間數據類型。 時間戳rowversion的已棄用同義詞。

有關更多詳細信息請參考here

1

其他人正確地指出,時間戳是一個二進制計數器。儘管如此,如果在數據庫的任何表中都有時間戳記和記錄日期時間,則可以使用該信息從任何時間戳記到日期範圍。 日誌表是一個很好的選擇。假設您的導入表是「發票」,則可以使用類似下面的查詢:

WITH TS 
AS 
(
SELECT 
    L1.LastDateUpdated, COALESCE(L2.LastDateUpdated, {TS '2099-12-31 00:00:00'}) as LastDateUpdatedTo, 
    L1.[TIMESTAMP], L2.[TIMESTAMP] as [TIMESTAMPTo] 
FROM 
(
    SELECT L1.[LastDateUpdated] 
      ,L1.[TIMESTAMP] 
      ,ROW_NUMBER() OVER (ORDER BY L1.[LastDateUpdated]) ID 
    FROM [Log] L1 
) L1 
left join 
(
    SELECT L2.[LastDateUpdated] 
      ,L2.[TIMESTAMP] 
      ,ROW_NUMBER() OVER (ORDER BY L2.[LastDateUpdated]) ID 
    FROM [Log] L2 
) L2 
    ON L1.ID = L2.ID - 1 
) 
SELECT TS.LastDateUpdated, TS.LastDateUpdatedTo, * from [Invoices] 
    inner join TS ON [Invoices].Timestamp between TS.Timestamp and 
TS.TIMESTAMPTo 
ORDER BY TS.TIMESTAMPTo DESC 
相關問題