sql server時間戳timestamp

原文鏈接:https://www.cnblogs.com/hanke123/p/4741561.html

在SQL Server中聯機叢書是這樣說的:

SQL Server timestamp 數據類型與時間和日期無關。SQL Server timestamp 是二進制數字,它表明數據庫中數據修改發生的相對順序。實現 timestamp 數據類型最初是爲了支持 SQL Server 恢復算法。每次修改頁時,都會使用當前的 @@DBTS 值對其做一次標記,然後 @@DBTS 加1。這樣做足以幫助恢復過程確定頁修改的相對次序,但是 timestamp 值與時間沒有任何關係。

我用口水話解釋一下便於理解:

我們知道數字類型有個“標識”屬性,設置好“標識種子”、“標識遞增量”,每增加一條記錄時,這個字段的值就會在最近的一個標識值基礎上自動增加,這樣我們可以知道哪些記錄是先添加的,哪些記錄是後添加的,但是我們無法知道哪些記錄修改過。timestamp這個類型的字段呢,每增加一條記錄時,它會在最近的一個時間戳基礎上自動增加,當修改某條記錄時,它也會在最近的一個時間戳基礎上自動增加,所以我們就知道哪些記錄修改過了。

 

timestamp 這種數據類型表現自動生成的二進制數,確保這些數在數據庫中是唯一的。timestamp 一般用作給錶行加版本戳的機制。存儲大小爲 8 字節。

註釋 Transact-SQL timestamp 數據類型與在 SQL-92 標準中定義的 timestamp 數據類型不同。SQL-92 timestamp 數據類型等價於 Transact-SQL datetime 數據類型。

Microsoft® SQL Server™ 將來的版本可能會修改 Transact-SQL timestamp 數據類型的行爲,使它與在標準中定義的行爲一致。到那時,當前的 timestamp 數據類型將用 rowversion 數據類型替換。

Microsoft® SQL Server™ 2000 引入了 timestamp 數據類型的 rowversion 同義詞。在 DDL 語句中儘可能使用 rowversion 而不使用 timestamp。rowversion 受數據類型同義詞行爲的制約。有關更多信息,請參見數據類型同義詞。

在 CREATE TABLE 或 ALTER TABLE 語句中,不必爲 timestamp 數據類型提供列名:

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp)如果沒有提供列名,SQL Server 將生成 timestamp 的列名。rowversion 數據類型同義詞不具有這樣的行爲。指定 rowversion 時必須提供列名。

一個表只能有一個 timestamp 列。每次插入或更新包含 timestamp 列的行時,timestamp 列中的值均會更新。這一屬性使 timestamp 列不適合作爲鍵使用,尤其是不能作爲主鍵使用。對行的任何更新都會更改 timestamp 值,從而更改鍵值。如果該列屬於主鍵,那麼舊的鍵值將無效,進而引用該舊值的外鍵也將不再有效。如果該表在動態遊標中引用,則所有更新均會更改遊標中行的位置。如果該列屬於索引鍵,則對數據行的所有更新還將導致索引更新。

不可爲空的 timestamp 列在語義上等價於 binary(8) 列。可爲空的 timestamp 列在語義上等價於 varbinary(8) 列。

 

Microsoft SQL Server 用兩個 4 字節的整數內部存儲 datetime 數據類型的值。第一個 4 字節存儲 base date(即 1900 年 1 月 1 日)之前或之後的天數。基礎日期是系統參考日期。不允許早於 1753 年 1 月 1 日的 datetime 值。另外一個 4 字節存儲以午夜後毫秒數所代表的每天的時間。

 

---------------------------------------------------------------------------------------------------

@@DBTS(SELECT @@DBTS) 爲當前數據庫返回當前 timestamp 數據類型的值。這一 timestamp 值保證在數據庫中是唯一的。

語法 @@DBTS

返回類型 varbinary

註釋 @@DBTS 返回當前數據庫最後所使用的時間戳值。當帶有 timestamp 列的一行被插入或更新時,會產生一個新的時間戳值。

1

SQL code

create table xx(id int, timestamp)

insert into xx(id) select 1

select * from xx

 

2

SQL code

create table tb_test(id int, ts timestamp) 

insert tb_test(id) select 1

union all select 2

union all select 3

union all select 4 

select *, nts=cast(ts as bigint) from tb_test

drop table tb_test 

 3

SQL code

declare @n bigint

set @N=8001

select cast(@N as timestamp)

 

           公開數據庫中自動生成的唯一二進制數字的數據類型。timestamp 通常用作給錶行加版本戳的機制。 存儲大小爲 8 個字節。 timestamp 數據類型只是遞增的數字,不保留日期或時間。 若要記錄日期或時間,請使用 datetime 數據類型。

備註 每個數據庫都有一個計數器,當對數據庫中包含 timestamp 列的表執行插入或更新操作時,該計數器值就會增加。該計數器是數據庫時間戳。 這可以跟蹤數據庫內的相對時間,而不是時鐘相關聯的實際時間。 一個表只能有一個 timestamp 列。每次修改或插入包含 timestamp 列的行時,就會在 timestamp 列中插入增量數據庫時間戳值。 這一屬性使 timestamp 列不適合作爲鍵使用,尤其是不能作爲主鍵使用。 對行的任何更新都會更改 timestamp 值,從而更改鍵值。如果該列屬於主鍵,那麼舊的鍵值將無效,進而引用該舊值的外鍵也將不再有效。 如果該表在動態遊標中引用,則所有更新均會更改遊標中行的位置。如果該列屬於索引鍵,則對數據行的所有更新還將導致索引更新。

使用某一行中的 timestamp 列可以很容易地確定該行中的任何值自上次讀取以後是否發生了更改。如果對行進行了更改,就會更新該時間戳值。 如果沒有對行進行更改,則該時間戳值將與以前讀取該行時的時間戳值一致。若要返回數據庫的當前時間戳值,請使用 @@DBTS。

Transact-SQL timestamp 數據類型不同於在 SQL-2003 標準中定義的 timestamp 數據類型。 SQL-2003 timestamp 數據類型等同於 Transact-SQL datetime 數據類型。

rowversion 的數據類型爲 timestamp 數據類型的同義詞,並具有數據類型同義詞的行爲。 在 DDL 語句,請儘量使用 rowversion 而不是 timestamp。 有關詳細信息,請參閱 數據類型同義詞 (Transact-SQL)。

在 CREATE TABLE 或 ALTER TABLE 語句中,不必爲 timestamp 數據類型指定列名,例如:

複製代碼 CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp);

如果不指定列名,則 Microsoft SQL Server 2005 數據庫引擎將生成 timestamp 列名;但 rowversion 同義詞不具有這樣的行爲。 在使用 rowversion 時,必須指定列名。

注意: 在使用其中的 SELECT 列表中具有 timestamp 列的 SELECT INTO 語句時,可能會生成重複的時間戳值。建議不要以這種方式使用 timestamp。

 

   數據庫中將timestamp進行轉換,可以轉換成十六進制字符串類型或者BIGINT的長整形

SELECT TS
,CAST(TS AS VARBINARY(8)) AS 'timestamp轉十六進制字符串' 
,CONVERT(BIGINT,TS) AS 'timestamp轉bigint類型'
FROM tb_Ts

                

總而言之,記住兩點:
1、timespan列不允許顯示插入及更新該字段,該字段會自動更新,可以理解爲類似自增字段
2、表中含timespan列,只要改行數據任一字段發生變化,timespan類型就會發生改變。


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章