首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server Timestamp 列手動更新指定日期時間的正確方法

     編輯:程式設計綜合問答

關鍵概念釐清

SQL Server 中的 `TIMESTAMP` 類型(現行名 `ROWVERSION`)不是日期時間類型!**

  • 它是 **自動生成的唯一二進制數字**,用於版本控制/樂觀鎖
  • 每次行修改自動更新,**不可手動插入/更新**
  • 與日期時間完全無關

用戶實際需求:更新 DATETIME 列

表結構應為:

CREATE TABLE table1 (
    id INT PRIMARY KEY,
    REG_DATE DATETIME  -- 或 DATETIME2, SMALLDATETIME
    -- 而非 TIMESTAMP
);

正確更新語句

標準 SQL(跨數據庫通用)

UPDATE table1
SET REG_DATE = '2015-12-31 23:59:59'
WHERE id = 目標行ID;  -- 必須有 WHERE 條件

SQL Server 專用格式

-- 無歧義 ISO 8601 格式(推薦)
UPDATE table1
SET REG_DATE = '2015-12-31T23:59:59'
WHERE id = 123;

-- 或使用 CONVERT 指定樣式
UPDATE table1
SET REG_DATE = CONVERT(DATETIME, '2015-12-31 23:59:59', 120)
WHERE id = 123;

若真的是 ROWVERSION/TIMESTAMP 列

**無法手動設置具體值**,只能:

  1. 觸發更新:修改該行任意其他列
    UPDATE table1 SET some_col = some_col WHERE id = 123; -- timestamp 自動更新
  2. 獲取當前值**:
    SELECT @@DBTS;  -- 當前數據庫最大 timestamp 值
    SELECT timestamp_col FROM table1 WHERE id = 123;

常見日期時間類型對照

類型範圍精度儲存建議用途
DATETIME1753-01-01 ~ 9999-12-313.33ms8 bytes舊系統兼容
DATETIME20001-01-01 ~ 9999-12-31100ns6-8 bytes**新開發首選**
SMALLDATETIME1900-01-01 ~ 2079-06-061 分鐘4 bytes不需秒精度
DATE0001-01-01 ~ 9999-12-311 天3 bytes僅日期
TIME00:00:00 ~ 23:59:59.9999999100ns3-5 bytes僅時間
TIMESTAMP/ROWVERSION自動遞增二進制-8 bytes版本戳/樂觀鎖

總結

用戶困惑源於 **類型名稱誤解**。`TIMESTAMP` ≠ 日期時間。若需存儲「15年12月31日」,列類型必須是 `DATETIME`/`DATETIME2` 等,直接用標準 ISO 格式字串更新即可,無需修改服務器時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved