Microsoft SQL Server - XML日期时间格式为零毫秒

时间:2016-11-02 14:53:26

标签: sql sql-server xml

我正在尝试使用Microsoft SQL Server的FOR XML生成XML。三个十进制毫秒是至关重要的。使用DATETIME2(3)适用于毫秒大于0的所有情况。在XML字符串转换中删除零毫秒。使用常规格式化技术不起作用。将零毫秒显示为.000的最佳方法是什么?期望的结果如下:

DECLARE @WithMilliseconds AS DATETIME2(3);
DECLARE @ZeroMilliseconds AS DATETIME2(3);

SET @WithMilliseconds = (SELECT '2016-11-02 12:34:56.789');
SET @ZeroMilliseconds = (SELECT '2016-11-02 00:00:00.000');

SELECT @WithMilliseconds AS [WithMilliseconds] INTO #WithMilliseconds
SELECT @ZeroMilliseconds AS [ZeroMilliseconds] INTO #ZeroMilliseconds

SELECT * FROM #WithMilliseconds FOR XML AUTO
SELECT * FROM #ZeroMilliseconds FOR XML AUTO

-- DOESNT WORK
SELECT CAST([ZeroMilliseconds] AS DATETIME2(3)) AS [ZeroMilliseconds] FROM #ZeroMilliseconds FOR XML AUTO

-- DOESNT WORK
SELECT CONVERT(DATETIME2(3), [ZeroMilliseconds]) AS [ZeroMilliseconds] FROM #ZeroMilliseconds FOR XML AUTO

需要的结果:

<_x0023_ZeroMilliseconds ZeroMilliseconds="2016-11-02T00:00:00.000"/>

2 个答案:

答案 0 :(得分:1)

XML中的格式通常是ISO8601。

  

注意:当毫秒(mmm)的值为0时,毫秒   值不显示。例如,值   &#39; 2012-11-07T18:26:20.000显示为&#39; 2012-11-07T18:26:20&#39;。

CAST and CONVERT, DATETIME formats, section ISO8601 (Code 126)

最大的问题是:为什么?

如果一切正常,您应该永远将XML视为带有额外字符的文本。 XML应该永远用字符串方法解析。正确阅读XML将是 - 当然! - 返回正确的值(如果XML有效)。它应该是不重要是否有.000 ...

您可以通过将正确格式化的字符串(而不是日期时间类型的值)发送到您的XML中来强制执行,但是< EM>气味 ...

更新

格式正确的字符串可以像这样实现

SELECT FORMAT(@WithMilliseconds,'yyyy-MM-ddTHH:mm:ss.fff')
SELECT FORMAT(@ZeroMilliseconds,'yyyy-MM-ddTHH:mm:ss.fff')

Format()需要SQL Server 2012 +)

答案 1 :(得分:1)

如果你想拥有它们,我可以建议:

SELECT CAST(ZeroMilliseconds As varchar(23)) as ZeroMilliseconds 
FROM #ZeroMilliseconds 
FOR XML AUTO;