Joh*_*ock 8 t-sql sql-server sql-server-2008
试图解决这个问题,根据MSDN上的Cast和Convert文档,这应该是可能的( http://msdn.microsoft.com/en-us/library/ms187928.aspx)
看看转换表.

我正在运行以下代码:
CREATE TABLE TableName (
ID bigint Identity(1,1),
SomeValue nvarchar(20) not null,
TimestampColumn timestamp not null)
Insert Into TableName (SomeValue)
values ('testing')
SELECT Convert(decimal, TimeStampColumn) from TableName
Run Code Online (Sandbox Code Playgroud)
但是我只是得到以下错误:
将数据类型时间戳转换为数字时出错.
根据文档应该是可能的,还是我遗漏了什么?注意我还需要转换回相同的时间戳值.
SELECT TimeStampColumn, Convert(timestamp, Convert(decimal, TimeStampColumn))
FROM TableName
Run Code Online (Sandbox Code Playgroud)
最后,上面的查询应该呈现相同的值.
Rah*_*hul 10
试试这个; 虽然MSDN说这是一个隐式转换,但它实际上不起作用.所以,我正在做的是将其转换为INT然后转换为十进制(无论如何,INT到十进制是隐式的)
select val, CAST((CONVERT(bigint, timestampcol)) as decimal) as 'TS as decimal'
from teststmp
Run Code Online (Sandbox Code Playgroud)
我认为这是一种更安全的方式。
SELECT CASE
WHEN Cast(timestampcol AS BIGINT) >= 0 THEN
Cast(timestampcol AS BIGINT)
ELSE 18446744073709551615 + Cast(timestampcol AS BIGINT)
END
Run Code Online (Sandbox Code Playgroud)
下面显示了否则直接转换为 bigint 将返回负数,这可能不是所需的结果。
USE tempdb;
IF DB_ID('TestDBTS') IS NOT NULL
DROP DATABASE TestDBTS;
CREATE DATABASE TestDBTS;
USE TestDBTS;
SELECT CAST(CAST(@@DBTS AS BIGINT) AS DECIMAL(20,0))
/*2000*/
/*Hack to manually set the timestamp. Undocumented, Unguaranteed & Dangerous!
Do not use except on test databases.*/
DBCC WRITEPAGE(TestDBTS, 1, 9, 412, 8, 0xFFFFFFFFFFFFFF7F);
ALTER DATABASE TestDBTS SET OFFLINE WITH ROLLBACK IMMEDIATE;
ALTER DATABASE TestDBTS SET ONLINE WITH ROLLBACK IMMEDIATE;
USE TestDBTS;
SELECT CAST(CAST(@@DBTS AS BIGINT) AS DECIMAL(20,0))
/*9223372036854775807*/
CREATE TABLE T
(
X INT,
Y TIMESTAMP
)
INSERT INTO T(X) VALUES(1)
SELECT CAST(CAST(@@DBTS AS BIGINT) AS DECIMAL(20,0))
/*-9223372036854775807*/
SELECT CASE WHEN CAST(@@DBTS AS BIGINT) >= 0
THEN CAST(@@DBTS AS BIGINT)
ELSE 18446744073709551615 + CAST(@@DBTS AS BIGINT)
END
/*9223372036854775808*/
Run Code Online (Sandbox Code Playgroud)