SQL Server 将时间戳数据类型转换为十进制

问题描述 投票:0回答:3

一直在尝试解决这个问题,根据 MSDN 上的 Cast 和 Convert 文档,这应该是可能的( http://msdn.microsoft.com/en-us/library/ms187928.aspx

查看转换表。

enter image description here

我正在运行以下代码:

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

但是我只是收到以下错误:

将数据类型时间戳转换为数字时出错。

根据文档,这应该是可能的,还是我遗漏了什么? 请注意,我还需要转换回相同的时间戳值。

SELECT TimeStampColumn, Convert(timestamp, Convert(decimal, TimeStampColumn)) 
FROM TableName

最终上述查询应该呈现相同的值。

sql-server sql-server-2008 t-sql
3个回答
11
投票

试试这个;尽管 MSDN 说这是隐式转换,但实际上不起作用。所以,我正在做的是将其转换为 INT,然后转换为十进制(INT 到十进制无论如何都是隐式的)

select val, CAST((CONVERT(bigint, timestampcol)) as decimal) as 'TS as decimal' 
from teststmp

但是,这仅在时间戳小于 bigint 的最大值时才有效。 Bigint 已签名。时间戳没有签名,并且永远不会低于零,因此它们的可能值范围不同。


5
投票

我认为这是一种更安全的方式。

SELECT CASE 
         WHEN Cast(timestampcol AS BIGINT) >= 0 THEN 
         Cast(timestampcol AS BIGINT) 
         ELSE 18446744073709551615 + Cast(timestampcol AS BIGINT)
       END 

以下内容显示,否则直接转换为 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*/

-1
投票

试试这个:

SELECT CONVERT(decimal, TimeStampColumn + 0)
FROM TableName
© www.soinside.com 2019 - 2024. All rights reserved.