2017-09-13 269 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