我正在尝试使用 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"/>
最佳答案
XML 中的格式通常为 ISO8601。
Note: When the value for milliseconds (mmm) is 0, the millisecond value is not displayed. For example, the value '2012-11-07T18:26:20.000 is displayed as '2012-11-07T18:26:20'.
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+)
关于sql - Microsoft SQL Server - 零毫秒的 XML 日期时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40383019/