2011-02-10 86 views
27

我希望將具有DATETIMEOFFSET字段的錶轉換爲DATETIME字段但是通過注意偏移量來重新計算時間。這實際上將該值轉換爲UTC如何將Sql Server 2008 DateTimeOffset轉換爲日期時間

例如。

CreatedOn: 2008-12-19 17:30:09.0000000 +11:00

,將轉換爲:

CreatedOn: 2008-12-19 06:30:09.0000000

CreatedOn: 2008-12-19 06:30:09.0000000 + 00:00 < - 這是一個DATETIMEOFFSET,但UTC

乾杯:)

回答

45

使用幾乎任何樣式將導致DATETIME2值轉換爲被轉換爲UTC。
此外,從DATETIME2轉換爲DATETIMEOFFSET簡單地設置在+00:00偏移,每下面,所以它是一個快速的方法來從Datetimeoffset(offset!=0)轉換爲Datetimeoffset(+00:00)

declare @createdon datetimeoffset 
set @createdon = '2008-12-19 17:30:09.1234567 +11:00' 

select CONVERT(datetime2, @createdon, 1) 
--Output: 2008-12-19 06:30:09.12 

select convert(datetimeoffset,CONVERT(datetime2, @createdon, 1)) 
--Output: 2008-12-19 06:30:09.1234567 +00:00 
3

注:時區信息轉化丟棄如果沒有指定樣式( 「126」 在這裏)的。它可能也會被丟棄在其他一些風格中,我不知道 - 在任何情況下,以下內容都可以正確調整TZ信息。見CAST and CONVERT

select convert(datetime, cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset), 126) as utc; 

快樂SQL'ing。

編輯

如果它很重要,但... datetime不能實際存儲精度/準確度的該級別不知道。如果上述運行,小數秒將被截斷爲3位數(並且精度小於該數值)。相同-相同與datetime2(和datetimeoffset(7))產生非截斷值:

select convert(datetime2, cast('2008-12-19 17:30:09.1234567 +11:00' as datetimeoffset(7)), 126) as utc; 
+0

什麼是風格126?爲什麼126? – 2011-02-10 09:10:11

+0

@ Pure.Krome請參閱答覆中的CAST和CONVERT鏈接。因爲我喜歡ISO 8601,所以不得不選擇一個。它與網絡維基挑選1沒有區別。正如所指出的(在兩個答案中)某些樣式*可能不考慮TZ。 – 2011-02-10 13:44:08

+1

SQL Server 2008 R2中的快速測試顯示只使用樣式「0」或(等同)省略樣式代碼丟棄時區信息。 MSDN文檔中列出的任何其他代碼將保留它。 – 2012-07-26 17:28:21

17

我會使用內置的SQL選項:

select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00') 
9

我知道這是一個老問題,但是,如果您想將DateTimeOffset轉換爲DateTime,我認爲您需要考慮您要轉換的服務器的時區。如果你只是做一個CONVERT(日期時間,@MyDate,1),你只會丟失時區,這可能會導致不正確的轉換。

我想你首先需要切換DateTimeOffset值的偏移量,然後進行轉換。

DECLARE @MyDate DATETIMEOFFSET = '2013-11-21 00:00:00.0000000 -00:00'; 
SELECT CONVERT(DATETIME, SWITCHOFFSET(@MyDate, DATEPART(tz,SYSDATETIMEOFFSET()))); 

轉換的結果是 ':00:2013年11月21日00 00.0000000 -00:00' 到誰的偏移的服務器上的日期時間爲-7:00將是2013年11月20日17:00 :00.000。通過上述邏輯,它不會計算服務器的時區或DateTime值的偏移量,它將在服務器時區中轉換爲DateTime。

我相信你需要這樣做,因爲DateTime值包含一個假設,即該值在服務器的時區。

相關問題