我有一個以日期時間片(年,月,日,時,分,秒,毫秒)存儲爲整數的表。我想將它們連接成一個datetime
列。SQL Server 2008 R2 - 將所有日期時間部分(作爲整數)轉換爲日期時間列
我試過各種方法,但沒有工作 - 似乎沒有簡單的方法把這些項目放在一起?
我有一個以日期時間片(年,月,日,時,分,秒,毫秒)存儲爲整數的表。我想將它們連接成一個datetime
列。SQL Server 2008 R2 - 將所有日期時間部分(作爲整數)轉換爲日期時間列
我試過各種方法,但沒有工作 - 似乎沒有簡單的方法把這些項目放在一起?
您可以將每個零件轉換爲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(您在問題中標記的)開始的日期時間值。
之前的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。
謝謝!我拿出第二個答案,但我也可以看到你的價值。謝謝! – scootsch
如果您可以升級到SQL Server ** 2012 **或更新版本,則可以使用['DATEFROMPARTS'](https://msdn.microsoft.com/en-us/library/hh213228.aspx) –
@marc_s實際上,'datetimefromparts' ... –
@ZoharPeled:絕對正確 - 熱量正在進入我的大腦,看起來:-)謝謝 –