【问题标题】:Storing Date Time in an XML column - XML format vs SQL Format在 XML 列中存储日期时间 - XML 格式与 SQL 格式
【发布时间】:2013-09-03 16:16:34
【问题描述】:

我有一个存储过程,它有参数OrderID (bigint) 和ApprovalDateTime(varchar(25))

SP 仅使用给定OrderID 的以下 XML 更新名为 UserDef 的 XML 列:

<UserDef>
<ApprovalDateTime>01/01/2013 13:30:30</ApprovalDateTime>
</UserDef>

我的问题是,在将这样的日期时间值存储在 XML 列中时,哪种格式最好?

  1. ISO 8601 XML 格式,如2002-05-30T09:00:00
  2. 类似01/01/2013 13:30:30
  3. 的字符串
  4. 20130101 13:30:30 等不分隔格式
  5. 或任何其他格式

你会推荐哪一个?

此日期将被提取到另一个存储过程中,以显示在 SSRS 报告的列中。

【问题讨论】:

  • 你把 XML 删掉并使用日期时间怎么样?
  • 为什么不将实际的DateTime 值存储在实际的DateTime 列中?您可以随时添加 XML 绒毛,而不必担心数据库中的格式。数据库应该存储data;客户端是唯一应该知道或关心格式化的层。
  • 为什么不对报告使用演示格式?我建议您将 ApprovalDateTime 参数设置为日期时间而不是 varchar。
  • @AaronBertrand:我同意这一点,但由于涉及复制、镜像、BizTalk 等复杂性,添加列或更改列类型不是一种选择。这是数百个共享同一张表的客户中的一个客户的要求。这就是为什么我们在此表中使用现有的“包罗万象”列 UserDef,而不是添加一个名为 ApprovalDateTime 的新列。

标签: sql tsql sql-server-2005 sqlxml sqldatetime


【解决方案1】:

我的第一个建议是修复数据类型。绝对没有理由我可以理解这个单个值应该与所有额外的 XML 绒毛一起存储。将演示内容留给演示层。

鉴于您现在似乎坚持使用它,我会使用 ISO 8601(第一个选项)。为什么?

  1. 使用 mm/dd/yyyy(您的选项 2)容易以各种方式产生误解,例如,如果您使用 05/06/2013,我怎么知道是 5 月 6 日还是 6 月 5 日?您的所有观众都会喜欢您选择的相同日期格式吗?你还知道吗?事实上,要确定这是一个问题的原因,我什至不知道您的意思是mm/dd/yyyy 还是dd/mm/yyyy

  2. 不分隔的格式阅读起来稍微麻烦一些,尤其是当日期包含连续字符时,例如20110110。破折号可以是一个很好的视觉分隔符,只是不要忘记 T:

    SET LANGUAGE FRENCH;
    SELECT CONVERT(DATETIME, '2013-05-06 13:30:30');
    

    结果(6 月 5 日!):

    2013-06-05
    

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多