2017-09-13 266 views
1

對於SQL Server 2008 R2在下面的格式中選擇一組日期的XML消息,我需要:SQL Server日期時間ss.mmmZ

yyyy-mm-ddThh:mi:ss.mmmZ 

我搜索谷歌和堆棧溢出了一下,來到以下解決方案:

SELECT STUFF(CONVERT(VARCHAR(50), CAST(GETDATE() AS DATETIMEOFFSET), 127),24,4,'') 

這工作正常,除了毫秒的日期是「000」。在這種情況下,它選擇NULL。

你能幫我找到一個解決方案,也適用於毫秒爲「000」的日期嗎?

您可以使用下面的代碼段玩弄:

declare @timestamps table (
i int, 
timestamp datetime 
) 

insert into @timestamps (i, timestamp) 
values 
(1, '2017-09-13 01:00:00.003'), 
(2, '2017-09-13 02:00:00.333'), 
(3, '2017-09-13 03:00:00.000'), 
(4, '2017-09-13 04:00:00') 

select i, timestamp, STUFF(CONVERT(VARCHAR(50), CAST(timestamp AS DATETIMEOFFSET), 127),24,4,'') from @timestamps 
+0

是這不夠:'我選擇了我,時間戳,CONVERT(varchar(50),timestamp,127)FROM @ timestamps' – Tanner

+0

我首先嚐試了這一點,但是 - 針對MS SQL文檔中寫的內容 - 它不顯示「Z」結束(時區偏移)。因此,您示例中的輸出爲「2017-09-13T01:00:00.003」,而不是「2017-09-13T01:00:00.003Z」。 – Malawirel

回答

1

從什麼據我所知,您使用stuff()擺脫了小數點後三位的毫秒數。

相反,你可以只指定datetimeoffset(3)精度而不是讓它默認爲(7)的:

select 
    i 
    , dto3 = convert(varchar(32),convert(datetimeoffset(3),timestamp),127) 
    , plusZ = convert(varchar(32),timestamp,127)+'Z' --without converting to datetimeoffset 
    -- /* SQL Server 2012+ */, tsFormat = format(timestamp,'yyyy-MM-ddTHH:mm:ss.fffZ') 
from @timestamps 

rextester演示:http://rextester.com/VKXBET35937

回報:

+---+--------------------------+--------------------------+ 
| i |   dto3   |   plusZ   | 
+---+--------------------------+--------------------------+ 
| 1 | 2017-09-13T01:00:00.003Z | 2017-09-13T01:00:00.003Z | 
| 2 | 2017-09-13T02:00:00.333Z | 2017-09-13T02:00:00.333Z | 
| 3 | 2017-09-13T03:00:00Z  | 2017-09-13T03:00:00Z  | 
| 4 | 2017-09-13T04:00:00Z  | 2017-09-13T04:00:00Z  | 
| 5 | 2017-09-13T14:12:34.567Z | 2017-09-13T14:12:34.567Z | 
+---+--------------------------+--------------------------+ 

在SQL Server 2012+以上工作爲好,雖然你可以使用format()如果你想永遠有0毫秒:

format(timestamp,'yyyy-MM-ddTHH:mm:ss.fffZ') 

format()可以慢,看看這裏:format() is nice and all, but… - Aaron Bertrand

+0

非常感謝!你的第一個建議正是我所期待的!是的,我使用'STUFF()'在小數點後第三位切斷毫秒。我不知道'datetimeoffset'函數的「fractional seconds precision」參數。 – Malawirel

+0

@Malawirel樂於幫助! - 你是如何將'datetimeoffset'與'convert(varchar(32),timestamp,127)+'Z''結合使用的呢? – SqlZim

2

您可能可能需要使用相同的代碼格式,但創建一個case語句當毫秒= 0

+1

這似乎工作正常。也許有一個更優雅的解決方案來解決這個問題嗎?在將此標記爲「正確」答案之前,我會等待更多的答覆。這裏是我使用的代碼: '選擇 \t情況 \t \t時DATEPART(毫秒,時間戳)= 0 \t \t然後CONVERT(VARCHAR(50),CAST(時間戳AS DATETIMEOFFSET),127) \t \t別的STUFF(CONVERT(VARCHAR(50),CAST(timestamp AS DATETIMEOFFSET),127),24,4,'') \t end from @ timestamps' – Malawirel