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

标签 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"/>

最佳答案

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/

相关文章:

mysql - SQL - 如何检索数字范围内的第一个空闲数字

xml - xslt:过滤排序结果集的匹配位置

c# - 将 Treeviews 放在 TabControl 内容页面中

sql - 高级 SQL GROUP BY 查询

c++ - 如何使用 SQL 更新数据库 (MS Access .mdb) 中的数据

sql - 每行中非空列的计数

sql-server - 根据连接选择更新 SQL 记录

java - 检查根/子元素中是否存在元素

sql - 当多列数据在某些列中为空时,如何获取单行数据?

c# - 如何确定sql server中连续的日期记录