timestamp 通常用作给表行加版本戳的机制。
timestamp 公开数据库中自动生成的唯一二进制数字的数据类型。
存储大小为 8 个字节。 timestamp 数据类型只是递增的数字,不保留日期或时间。
每个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操作时,该计数器值就会增加。
该计数器是数据库时间戳。 这可以跟踪数据库内的相对时间,而不是时钟相关联的实际时间。
一个表只能有一个 timestamp 列, 每次修改或插入包含 timestamp 列的行时,就会在 timestamp 列中插入增量数据库时间戳值。
由于timestamp在SQL SERVER 2005数据库中,不可为空的timestamp类型在语义上等同于binary(8)类型,可为空的 timestamp类型在语义上等同于varbinary(8)类型,这将导致在C#程序中获取到的timestamp类型则变成了byte[]类型。所以如果我们需要从数据库中获取并使用这个时间戳的话就必需经过转换。
在程序中我们发现,通过ADO.NET获取数据库中timestamp字段值到程序中,结果类型为byte[]。假设在数据库中timestamp的值为0x00000000000007D6,那么获取到.net程序中的值就不是这样了,一把来说会变成byte[]的数组类型。
方法一(在SQL中转换):
SELECT TS ,CAST(TS AS VARBINARY(8)) AS 'timestamp转十六进制字符串' ,CONVERT(BIGINT,TS) AS 'timestamp转bigint类型' FROM tb_Ts
方法二(在程序中转换,调用下面的方法即可):
/// <summary> /// 将数据库中timespan转换成十六进制字符串 /// </summary> /// <param name="objTs">从数据库中获取的timespan值</param> /// <returns>timespan十六进制字符串</returns> public string ConvertToTimeSpanString(object objTs) { byte[] btTsArray = objTs as byte[]; string strTimeSpan = "0x" + BitConverter.ToString(btTsArray).Replace("-", ""); return strTimeSpan; }
/// <summary> /// 将十六进制字符串转换成数据库中timespan /// </summary> /// <param name="TimeSpanString">十六进制字符串</param> /// <returns></returns> public byte[] ConvertTimeSpanStringToBytes(string TimeSpanString) { TimeSpanString = TimeSpanString.Substring(2, TimeSpanString.Length-2); byte[] returnBytes = new byte[TimeSpanString.Length / 2]; for (int i = 0; i < returnBytes.Length; i++) { returnBytes[i] = Convert.ToByte(TimeSpanString.Substring(i * 2, 2), 16); } return returnBytes; }