2017-01-17 21 views
1

有人在我們的團隊寫了下面的查詢年前消息8114:錯誤的數據類型時間戳轉換爲日期時間在SQL Server 2012中

create table #tempDocumentCategory (documentcategorycodeidno int , documentcategorycode varchar(50), documentcategorycodedescription varchar(200), timestamp datetime,Inactive bit) 
    insert #tempDocumentCategory(documentcategorycodeidno , documentcategorycode , documentcategorycodedescription , timestamp ,Inactive) 
    exec sp_getDocumentCategoriesCodesCtrl 1 

現在這個EXEC sp_getDocumentCategoriesCodesCtrl返回一個時間戳,然後存儲在日期時間類型列在上面創建的臨時表中。我們從未收到任何問題,直到最近一位客戶提出問題,指出頁面崩潰,並顯示一條錯誤消息,指出「將數據類型時間戳轉換爲日期時間」。

現在,我明白一個時間戳不是一個日期時間,因此不在這裏使用。據我可以檢查我看到日期時間和時間戳都具有相同的大小 - 字節(8)。我想知道爲什麼時間戳沒有自動轉換爲日期時間,我在這裏丟失/誤解了什麼。對不起,如果這是一個愚蠢的問題,我對SQL相當陌生。

CREATE PROCEDURE sp_getDocumentCategoriesCodesCtrl 
@ShowAllInd bit = 0 
AS 
/* Select record set */ 
IF @ShowAllInd = 0 
    SELECT 
     DocumentCategoryCodeIdNo, 
     DocumentCategoryCode, 
     DocumentCategoryCodeDescription, 
     Timestamp, 
     CAST(0 as BIT) as Inactive 
    FROM tDocumentCategory_Codes 
    WHERE 
     (DocumentCategoryCodeToEffectDate = '01/01/3000') 
    ORDER BY DocumentCategoryCode 
ELSE 
    SELECT 
     DocumentCategoryCodeIdNo, 
     DocumentCategoryCode, 
     DocumentCategoryCodeDescription, 
     Timestamp, 
     Inactive = 
     CASE WHEN DocumentCategoryCodeToEffectDate <> '01/01/3000' THEN CAST(1 as BIT) 
     ELSE CAST(0 as BIT) 
     END 
    FROM tDocumentCategory_Codes 
    ORDER BY DocumentCategoryCode 
RETURN(0) 

表定義

CREATE TABLE [dbo].[tDocumentCategory_Codes](
    [DocumentCategoryCodeIdNo] [int] IDENTITY(1,1) NOT NULL, 
    [DocumentCategoryCodeDomainIdNo] [int] NOT NULL, 
    [DocumentCategoryCode] [nvarchar](50) NOT NULL, 
    [DocumentCategoryCodeDescription] [nvarchar](200) NULL, 
    [DocumentCategoryCodeFromEffectDate] [datetime] NOT NULL, 
    [DocumentCategoryCodeToEffectDate] [datetime] NOT NULL, 
    [LanguageId] [char](5) NULL, 
    [DocumentCategoryCodeDefaultCodeInd] [bit] NULL, 
    [Timestamp] [timestamp] NOT NULL, 
CONSTRAINT [PK_tDocumentCategory_Codes] PRIMARY KEY CLUSTERED 
(
    [DocumentCategoryCodeIdNo] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
+0

請在此處粘貼[sp_getDocumentCategoriesCodesCtrl]代碼。 – Juozas

+0

sp_getDocumentCategoriesCodesCtrl定義粘貼:) –

+0

謝謝:)現在我需要table [tDocumentCategory_Codes]創建腳本 – Juozas

回答

1

以[時間戳]列與數據類型的時間戳存儲數據。 數據類型時間戳與日期時間數據類型沒有任何關係。時間戳只是在數據庫中自動遞增的值。所以,錯誤的決定是將時間戳轉換爲日期時間。您可以解決以下方式你的問題:

create table #tempDocumentCategory(
      documentcategorycodeidno int 
     ,documentcategorycode varchar(50) 
     ,documentcategorycodedescription varchar(200) 
     ,timestamp VARBINARY(8) 
     ,Inactive bit 
    ) 

如果你需要有日期時間,你需要改變你的表[tDocumentCategory_Codes],將[timestamp]列類型DATETIME,然後設置默認值(GETDATE( ))。在這種情況下,您可以在#tempDocumentCategory中使用DATETIME格式並獲得所需結果

+0

我已經通過完全刪除時間戳來解決問題,因爲它在本頁面上不是必需的,但我需要知道它爲什麼不能在這次轉換它,爲什麼它大部分時間都要轉換。我需要知道何時將時間戳轉換爲日期時間,何時不是。這有道理嗎? –

+0

TIMESTAMP只是數據庫的增量值,與日期沒有任何關係。更多關於此:https://msdn.microsoft.com/en-us/library/ms182776(v=SQL.90).aspx 所以,這裏壞消息,如果你需要將舊的時間戳值轉換爲日期時間。它是不可能的:( – Juozas

+0

Ps回答你的問題,有些情況下,轉換可能時: 在某些時候,您可以將增量值(fe INT)轉換爲日期時間 例如:select cast(1234567 as datetime)。結果是不可預知的。 但是,當數據庫自動計數器達到值X時,不可能進行轉換。例如:選擇投射(12345678作爲日期時間) – Juozas

相關問題