2014-10-20 92 views
-4

我有下面的整數格式fetchtime列的表:SQL整型轉換爲DateTime

20100903063110 
20110403022433 
20130203142033 
20130103153313 

等。其中,這將是日期和時間一起(YYYYMMDDHHMISS

我需要的所有記錄轉換在此列到SQL Server DateTime格式:YYYY-MM-DD HH:MI:SS

一旦做到這一點,我想提取轉換的日期和時間格式分開存儲在同一張表的兩個新列中。

在尋找這個時,我發現了下面提到的@Andomar使用子字符串的轉換,但無法使其適應我的要求。

select 
    convert(datetime, substring(sub.Dt,1,4) + '-' + 
        substring(sub.Dt,5,2) + '-' + 
        substring(sub.Dt,7,2) + ' ' + 
        substring(sub.Dt,9,2) + ':' + 
        substring(sub.Dt,11,2) + ':' + 
        substring(sub.Dt,13,2)) 
from  
    (select '20100101000000' as Dt) sub 
+2

convert/substr有什麼問題?它看起來像它做你想要的? – 2014-10-20 15:17:55

+3

儘管該值可能會巧合地存儲爲數字類型,但出於轉換目的,該數字沒有有意義的日期/時間表示。爲此,它需要被視爲一個字符串。現有的方法(從子串構造日期/時間)似乎是合理的。 – David 2014-10-20 15:20:04

+0

@AlexK。謝謝回覆。是的,它只轉換'20100101000000'值。我怎麼能用這個來轉換列中的所有記錄? – Jain 2014-10-20 15:22:38

回答

0

耆那教,它看起來像你想的代碼in the answer here適應自己的情況。 Andomar在那裏做的是從一個只包含單個值的子查詢中選擇信息,因爲他無法訪問原始海報的源代碼和表格。這樣做可以讓每個人都可以運行並查看它,無論他們碰巧擁有哪種數據庫模式。

將這樣的內容適配到自己的代碼中將非常簡單:只需將alias.column引用(這裏是sub.Dt)替換爲您自己的值,然後將您的表放入FROM子句而不是子查詢中。因此,如果你的表被命名爲SomeTable,和您的列被命名爲FetchTime,查詢變爲:

select 
    convert(datetime, substring(SomeTable.FetchTime,1,4) + '-' + 
        substring(SomeTable.FetchTime,5,2) + '-' + 
        substring(SomeTable.FetchTime,7,2) + ' ' + 
        substring(SomeTable.FetchTime,9,2) + ':' + 
        substring(SomeTable.FetchTime,11,2) + ':' + 
        substring(SomeTable.FetchTime,13,2)) 
from  
    SomeTable 

理論上你就可以有一個問題,如果你FetchTime場被存儲爲整數:SUBSTRING()可能不會對這些數據的工作類型。要解決這一點,你可以CAST()價值爲varchar,就像這樣:

select 
    convert(datetime, substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),1,4) + '-' + 
        substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),5,2) + '-' + 
        substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),7,2) + ' ' + 
        substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),9,2) + ':' + 
        substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),11,2) + ':' + 
        substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),13,2)) 
from  
    SomeTable 

或者,如果你只是單值之後,就可以回到原來的查詢和簡單的寫:

select 
    convert(datetime, substring(sub.Dt,1,4) + '-' + 
        substring(sub.Dt,5,2) + '-' + 
        substring(sub.Dt,7,2) + ' ' + 
        substring(sub.Dt,9,2) + ':' + 
        substring(sub.Dt,11,2) + ':' + 
        substring(sub.Dt,13,2)) 
from  
    (select CAST(FetchTime AS VARCHAR(20)) as Dt FROM SomeTable) sub 
+0

AHiggins非常感謝你,你救了我的一天。這就是我正在尋找的:)現在,我已將列的所有值轉換爲SQL DateTime格式。 – Jain 2014-10-20 20:56:17