sql server時間戳記timestamp

來源:互聯網
上載者:User

標籤:

sql server時間戳記timestamp

在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。

mysql的時間戳記與sqlserver完全不同,後者與時間無關,只是防止並發,而前者可以記錄時間

 

mysql TIMESTAMP(時間戳記)詳解 TIMESTAMP的變體1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP   在建立新記錄和修改現有記錄的時候都對這個資料列重新整理 2,TIMESTAMP DEFAULT CURRENT_TIMESTAMP  在建立新記錄的時候把這個 欄位設定為目前時間,但以後修改時,不再重新整理它 3,TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  在建立新記錄的時候把這個欄位設定為0, 以後修改時重新整理它  www.2cto.com   4,TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP   在建立新記錄的時候把這個欄位設定為給定值,以後修改時重新整理它MySQL目前不支援列的Default 為函數的形式,如達到你某列的預設值為當前更新日期 與時間的功能,你可以使用TIMESTAMP列類型下面就詳細說明TIMESTAMP列類型 *TIMESTAMP列類型*TIMESTAMP值可以從1970的某時的開始一直到2037年,精度為一秒,其值作為數字顯示。TIMESTAMP值顯示尺寸的格式如下表所示::+---------------+----------------+| 列類型    | 顯示格式    || TIMESTAMP(14) | YYYYMMDDHHMMSS | | TIMESTAMP(12) | YYMMDDHHMMSS  || TIMESTAMP(10) | YYMMDDHHMM   || TIMESTAMP(8) | YYYYMMDD    || TIMESTAMP(6) | YYMMDD     || TIMESTAMP(4) | YYMM      || TIMESTAMP(2) | YY       |+---------------+----------------+“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的顯示尺寸 創造最常見的顯示尺寸是6、8、12、和14。你可以在建立表時指定一個任意的顯示尺寸,但是定義列長為0或比14大均會被強制定義為列長14。列長在從1~13範圍的奇數值尺寸均被強製為下一個更大的偶數。 *列如:*定義欄位長度   強制欄位長度TIMESTAMP(0) -> TIMESTAMP(14)TIMESTAMP(15)-> TIMESTAMP(14)TIMESTAMP(1) -> TIMESTAMP(2)TIMESTAMP(5) -> TIMESTAMP(6) 所有的TIMESTAMP列都有同樣的儲存大小,使用被指定的時期時間值的完整精度 (14位)儲存合法的值不考慮顯示尺寸。不合法的日期,將會被強製為0儲存*這有幾個含意: *  www.2cto.com  1、雖然你建表時定義了列TIMESTAMP(8),但在你進行資料插入與更新時TIMESTAMP列 實際上儲存了14位的資料(包括年月日時分秒),只不過在你進行查詢時MySQL返回給 你的是8位的年月日資料。如果你使用ALTER TABLE拓寬一個狹窄的TIMESTAMP列, 以前被“隱蔽”的資訊將被顯示。2、同樣,縮小一個TIMESTAMP列不會導致資訊失去,除了感覺上值在顯示時, 較少的資訊被顯示出。3、儘管TIMESTAMP值被儲存為完整精度,直接操作儲存值的唯一函數是UNIX_TIMESTAMP(); 由於MySQL返回TIMESTAMP列的列值是進過格式化後的檢索的值,這意味著你可能不能使用某些函數來操作TIMESTAMP列(例如HOUR()或SECOND()),除非TIMESTAMP值的相關部分被包含在格式化的值中。 例如,一個TIMESTAMP列只有被定義為TIMESTAMP(10)以上時,TIMESTAMP列的HH部分才會被顯示, 因此在更短的TIMESTAMP值上使用HOUR()會產生一個不可預知的結果。4、不合法TIMESTAMP值被變換到適當類型的“零”值(00000000000000)。(DATETIME,DATE亦然)*你可以使用下列語句來驗證:*CREATE TABLE test (‘id‘ INT (3) UNSIGNED AUTO_INCREMENT, ‘date1‘TIMESTAMP (8) PRIMARY KEY(‘id‘));INSERT INTO test SET id = 1;SELECT * FROM test;+----+----------------+| id | date1     |+----+----------------+| 1 | 20021114    |+----+----------------+ALTER TABLE test CHANGE ‘date1‘ ‘date1‘ TIMESTAMP(14);SELECT * FROM test;+----+----------------+| id | date1     |+----+----------------+| 1 | 20021114093723 |+----+----------------+ 你可以使用TIMESTAMP列類型自動地用當前的日期和時間標記INSERT或UPDATE的操作。 如果你有多個TIMESTAMP列,只有第一個自動更新。自動更新第一個TIMESTAMP列在下列任何條件下發生:1、列值沒有明確地在一個INSERT或LOAD DATA INFILE語句中指定。2、列值沒有明確地在一個UPDATE語句中指定且另外一些的列改變值。(注意一個UPDATE 設定一個列為它已經有的值,這將不引起TIMESTAMP列被更新,因為如果你設定一個列為 它當前的值,MySQL為了效率而忽略更改。)3、你明確地設定TIMESTAMP列為NULL.4、除第一個以外的TIMESTAMP列也可以設定到當前的日期和時間,只要將列設為NULL,或NOW()。CREATE TABLE test (  www.2cto.com  ‘id‘ INT (3) UNSIGNED AUTO_INCREMENT,‘date1‘ TIMESTAMP (14),‘date2‘ TIMESTAMP (14),PRIMARY KEY(‘id‘)); INSERT INTO test (id, date1, date2) VALUES (1, NULL, NULL);INSERT INTO test SET id= 2;+----+----------------+----------------+| id | date1     | date2     |+----+----------------+----------------+| 1 | 20021114093723 | 20021114093723 || 2 | 20021114093724 | 00000000000000 |+----+----------------+----------------+->第一條指令因設date1、date2為NULL,所以date1、date2值均為目前時間第二條指令 因沒有設date1、date2列值,第一個TIMESTAMP列date1為更新為目前時間, 而二個TIMESTAMP列date2因日期不合法而變為“00000000000000”UPDATE test SET id= 3 WHERE id=1;+----+----------------+----------------+| id | date1     | date2     |+----+----------------+----------------+| 3 | 20021114094009 | 20021114093723 || 2 | 20021114093724 | 00000000000000 |+----+----------------+----------------+->這條指令沒有明確地設定date2的列值,所以第一個TIMESTAMP列date1將被更新為目前時間 UPDATE test SET id= 1,date1=date1,date2=NOW() WHERE id=3;  www.2cto.com  +----+----------------+----------------+| id | date1     | date2     |+----+----------------+----------------+| 1 | 20021114094009 | 20021114094320 || 2 | 20021114093724 | 00000000000000 |+----+----------------+----------------+->這條指令因設定date1=date1,所以在更新資料時date1列值並不會發生改變而 因設定date2=NOW(),所以在更新資料時date2列值會被更新為目前時間此指令等效為 UPDATE test SET id= 1,date1=date1,date2=NULL WHERE id=3;因MySQL返回的 TIMESTAMP 列為數字顯示形式,你可以用DATE_FROMAT()函數來格式化 TIMESTAMP 列SELECT id,DATE_FORMAT(date1,‘%Y-%m-%d %H:%i:%s‘) As date1,DATE_FORMAT(date2,‘%Y-%m-%d %H:%i:%s‘) As date2 FROM test;+----+---------------------+---------------------+| id | date1        | date2        |+----+---------------------+---------------------+| 1 | 2002-11-14 09:40:09 | 2002-11-14 09:43:20 || 2 | 2002-11-14 09:37:24 | 0000-00-00 00:00:00 |+----+---------------------+---------------------+ SELECT id,DATE_FORMAT(date1,‘%Y-%m-%d‘) As date1,DATE_FORMAT(date2,‘%Y-%m-%d‘) As date2 FROM test;  www.2cto.com  +----+-------------+-------------+| id | date1    | date2    |+----+-------------+-------------+| 1 | 2002-11-14 | 2002-11-14 || 2 | 2002-11-14 | 0000-00-00 |+----+-------------+-------------+ 在某種程度上,你可以把一種日期類型的值賦給一個不同的日期類型的對象。 然而,而尤其注意的是:值有可能發生一些改變或資訊的損失: 1、如果你將一個DATE值賦給一個DATETIME或TIMESTAMP對象,結果值的時間部分被 設定為‘00:00:00‘,因為DATE值中不包含有時間資訊。  2、如果你將一個DATETIME或TIMESTAMP值賦給一個DATE對象,結果值的時間部分被刪除, 因為DATE類型不儲存時間資訊。3、儘管DATETIME, DATE和TIMESTAMP值全都可以用同樣的格式集來指定, 但所有類型不都有同樣的值範圍。例如,TIMESTAMP值不能比1970早,也不能比2037晚,這意味著,一個日期例如‘1968-01-01‘, 當作為一個DATETIME或DATE值時它是合法的,但它不是一個正確TIMESTAMP值! 並且如果將這樣的一個對象賦值給TIMESTAMP列,它將被變換為0。  www.2cto.com   *當指定日期值時,當心某些缺陷: * 1、允許作為字串指定值的寬鬆格式能被欺騙。例如,,因為“:”分隔字元的使用, 值‘10:11:12‘可能看起來像時間值,但是如果在一個日期中使用,上下文將作為年份被 解釋成‘2010-11-12‘。值‘10:45:15‘將被變換到‘0000-00-00‘,因為‘45‘不是一個合法的月份。 2、以2位元字指定的年值是模糊的,因為世紀是未知的。MySQL使用下列規則解釋2位年值: 在00-69範圍的年值被變換到2000-2069。 在範圍70-99的年值被變換到1970-1999。

sql server時間戳記timestamp

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.