2011-09-11 83 views
9

我有一張表,每行需要一個時間戳來標記它被插入的時間。我沒有太多的數據庫經驗,但是有些東西告訴我,這最好在數據庫端自動處理,例如通過存儲過程。如何在SQL Server中存儲/檢索時間戳?

MS SQL中有一個時間戳數據類型,但讀取它時,它被視爲一系列數字而不是C#中的DateTime對象。所以,如果我必須進行轉換,它不會僅僅是一個NVARCHAR數據類型嗎?

所以簡單地說,什麼是最簡單的方法(自動?)將時間戳插入到表中時插入一行?

編輯:表格定義非常簡單。它目前只有兩列,但仍缺乏時間戳列。

 SqlCommand command = con.CreateCommand(); 
     command.CommandText = "INSERT INTO Bio VALUES (" + 
      "@ID, @Name)"; 

     command.Parameters.AddWithValue("ID",number); 
     command.Parameters.AddWithValue("Name", name); 

     try 
     { 
      SqlDataReader thisReader = command.ExecuteReader(); 
      thisReader.Close(); 
     } 
     catch { // Do something }; 

解決方案好了,現在它工作。我首先嚐試通過Visual Studio 2008中的服務器資源管理器窗口添加新列。查找我的數據庫,右鍵單擊並選擇「新建查詢」。然後鍵入類似

ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate()) 

但我得到了

的ALTER TABLE SQL構造不支持 查詢不能在圖和條件窗格圖形表示的消息。

所以相反,我用圖形添加它。首先「打開表格定義」並在「數據類型」下的「列名稱」和「日期時間」下添加「創建日期」。刪除允許空值檢查。然後在列屬性中,我添加了

getutcdate() 

在名爲「默認值或綁定」的行的常規部分下。無論何時插入新行,數據庫都會自動將當前日期和時間作爲時間戳。

回答

8

有一個表中的CreatedDate列這樣創建:

ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate()) 

編輯:如果事後你想有)在該記錄您可以重新分配GETUTCDATE(每次更新更新的價值該列或另一個(我稱它爲Createddate,因此不應在更新中使用,但可以添加另一個或將其重命名爲Modifieddate)。我肯定會在存儲過程中包含這樣的列的更新,其中UPDATE不需要觸發器。

+0

我試圖使用這個命令行,但發現圖形編輯器更容易。我所做的是添加到原始問題的底部。感謝您的幫助。 –

+1

我知道這是一個非常古老的問題,但是太棒了! – Tom

1

您可以使用CURRENT_TIMESTAMPFN NOW()將時間戳插入到一行中。

6

SQL Server「timestamp」類型與標準的「timestamp」不同:更正確的是「rowversion」。數據類型「timestamp」已被棄用。See MSDN for all of this

您應該使用datetime which is a real date/time value

最簡單的方法就是對上表GETDATE或GETUTCDATE列的默認,這樣SQL Server自動維護它

編輯:更新

您可以使用此語法進行更新

UPDATE T SET col = @x, UpdatedDateTime = DEFAULT WHERE ... 

這很有用,因爲defa ult約束確定值不是代碼。所以如果你改變了默認值(比如你從GETDATE切換到GETUTCDATE),那麼你改變了一個約束,而不是代碼

+0

謝謝。這非常有啓發。 –

1

創建觸發器是一種方法,雖然可能不是最好的方式,也希望在該行更新來更新時間戳:

CREATE TRIGGER MyTimestampTrigger ON tblMyTable FOR INSERT,UPDATE AS 
UPDATE tblMyTable SET fldTimestamp=getdate() WHERE fldId IN (SELECT fldId FROM INSERTED) 
GO 

(如果FLDID是主鍵,fldTimestamp是時間戳字段和tblMyTable表的名稱)。

然而,其他答案在datetime列上的默認值可能是您的最佳選擇。

+0

對於UPDATE,您可以使用DEFAULT關鍵字'UPDATE T SET col = @x,UpdatedDateTime = DEFAULT WHERE ...'而不是觸發器 – gbn

+1

我實際上並不知道。這確實是一個更好的解決方案。 – DeCaf

+0

有趣。不過,我只是想在表格中添加很多行。它將用於統計目的,所以無論何時我看到事件X,都會添加一個X作爲ID的新列,並給出一個時間戳。沒有行的編輯,因爲我想稍後能夠檢索關於X的所有數據,所以我知道它發生的所有日期和時間。這就是我爲什麼選擇其他解決方案的原因。 –

相關問題