2016-06-22 35 views
0

我有一個以日期時間片(年,月,日,時,分,秒,毫秒)存儲爲整數的表。我想將它們連接成一個datetime列。SQL Server 2008 R2 - 將所有日期時間部分(作爲整數)轉換爲日期時間列

我試過各種方法,但沒有工作 - 似乎沒有簡單的方法把這些項目放在一起?

+3

如果您可以升級到SQL Server ** 2012 **或更新版本,則可以使用['DATEFROMPARTS'](https://msdn.microsoft.com/en-us/library/hh213228.aspx) –

+1

@marc_s實際上,'datetimefromparts' ... –

+0

@ZoharPeled:絕對正確 - 熱量正在進入我的大腦,看起來:-)謝謝 –

回答

0

您可以將每個零件轉換爲varchar並將它們以ISO日期時間字符串的格式連接在一起。然後使用Convert將字符串轉換爲DateTime

這裏是一個例子。您需要將每個硬編碼整數替換爲表中列的名稱。

SELECT CONVERT(DATETIME, CAST(2016 AS VARCHAR(4)) -- year 
    + '-' + CAST('0' + CAST(8 AS VARCHAR(2)) AS VARCHAR(2)) -- month 
    + '-' + RIGHT('0' + CAST(13 AS VARCHAR(2)), 2) -- day of month 
    + 'T' + RIGHT('0' + CAST(16 AS VARCHAR(2)), 2) -- hours (I assume its military time (24 hours)) 
    + ':' + RIGHT('0' + CAST(32 AS VARCHAR(2)), 2) -- minutes 
    + ':' + RIGHT('0' + CAST(07 AS VARCHAR(2)), 2) -- seconds 
    + '.' + RIGHT('000' + CAST(64 AS VARCHAR(3)), 3)) AS MyDate -- milliseconds 
FROM yourTable 

或者與列名(假定)

SELECT CONVERT(DATETIME, CAST(yt.Year AS VARCHAR(4)) -- year 
    + '-' + CAST('0' + CAST(yt.Month AS VARCHAR(2)) AS VARCHAR(2)) -- month 
    + '-' + RIGHT('0' + CAST(yt.Day AS VARCHAR(2)), 2) -- day of month 
    + 'T' + RIGHT('0' + CAST(yt.Hours AS VARCHAR(2)), 2) -- hours (I assume its military time (24 hours)) 
    + ':' + RIGHT('0' + CAST(yt.Minutes AS VARCHAR(2)), 2) -- minutes 
    + ':' + RIGHT('0' + CAST(yt.Seconds AS VARCHAR(2)), 2) -- seconds 
    + '.' + RIGHT('000' + CAST(yt.Milliseconds AS VARCHAR(3)), 3)) AS MyDate -- milliseconds 
FROM yourTable yt 

還要說明。 Microsoft建議您使用DateTime2而不是DateTime來保存從Sql Server 2008(您在問題中標記的)開始的日期時間值。

+1

您需要使用'T'作爲分隔符來創建ISO 8601日期時間字符串。否則SQL Server將嘗試解析字符串爲特定區域 –

+0

@PanagiotisKanavos - 謝謝,我更正了我的答案。 – Igor

+1

這個效果很好 - 謝謝!由於我的數字長度是6位,並且datetime數據類型需要三位數字,所以我不得不破解我的毫秒值。謝謝!! – scootsch

0

之前的SQL Server 2012中,你可以使用一系列的嵌套DATEADD()功能模仿DATETIMEFROMPARTS()功能

創建並填充樣本數據(在你的下一個問題,請救救我們這一步)

DECLARE @T as table 
(
    cYear int, 
    cMonth int, 
    cDay int, 
    cHour int, 
    cMinute int, 
    cSecond int, 
    cMillisecond int 
) 

INSERT INTO @T VALUES(2016, 6, 22, 16, 34, 25, 3) 

查詢:

SELECT *, 
     DATEADD(MILLISECOND, cMillisecond, 
      DATEADD(SECOND, cSecond, 
       DATEADD(MINUTE, cMinute, 
        DATEADD(HOUR, cHour, 
         DATEADD(DAY, cDay -1, 
          DATEADD(MONTH, cMonth - 1, 
           DATEADD(YEAR, cYear - 2000, '2000-01-01') 
          ) 
         ) 
        ) 
       ) 
      ) 
     ) As TheDate 
FROM @T 

結果:

cYear cMonth cDay cHour cMinute cSecond cMillisecond TheDate 
----- ------ ---- ----- ------- ------- ------------- ----------------------- 
2016 6  22  16  34  25  3   2016-06-22 16:34:25.003 

請注意,我使用的基準日期是2000年1月1日,因此您需要從年份中減去2000,從月份減去1,從日期減去1。

+0

謝謝!我拿出第二個答案,但我也可以看到你的價值。謝謝! – scootsch

相關問題