8

これを理解しようとしていて、MSDNのCast and Convert Documentationによると、これは可能であるはずです( 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

ただし、次のエラーが発生します。

データ型のタイムスタンプを数値に変換中にエラーが発生しました。

これはドキュメントによると可能であるはずですか、それとも何かが足りませんか?また、同じタイムスタンプ値に変換し直す必要があることに注意してください。

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

最後に、上記のクエリは同じ値をレンダリングする必要があります。

4

3 に答える 3

12

これを試して; MSDNによると、これは暗黙的な変換ですが、実際には機能しません。だから、私がやっていることは、それをINTに変換してから10進数に変換することです(INTから10進数への変換はとにかく暗黙的です)

select val, CAST((CONVERT(bigint, timestampcol)) as decimal) as 'TS as decimal' 
from teststmp
于 2012-05-25T18:30:46.340 に答える
4

これは私が思うより安全な方法です。

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*/
于 2012-05-25T19:10:15.657 に答える
-1

これを試して:

SELECT CONVERT(decimal, TimeStampColumn + 0)
FROM TableName
于 2012-05-25T17:54:02.883 に答える