【问题标题】:How to enforce specific date format in T-SQL?如何在 T-SQL 中强制执行特定的日期格式?
【发布时间】:2011-08-18 18:54:02
【问题描述】:

我有一个包含记录的表,其中包含一个 DATETIME 列。我正在编写一个存储过程,它将采用 startTime 和 endTime 并返回这两次之间的所有记录。我想强制用户以特定格式('YYYY-MM-DDThh:mm:ss.nnn')提供时间。原因是我的表不包含大量记录,并且我不想将数据检索限制在同一天的两个时间点(因此它们必须至少提供以秒为单位的时间)。

有没有办法强制执行?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    是的,但是您必须将参数作为字符串 (varchar) 而不是日期时间,因为日期时间值 2010-12-082010-12-08 00:00:00.000 是相同的。

    您可以验证输入字符串的长度是否满足要求,然后使用convert(datetime, startTime, 126)将其转换为日期时间。

    【讨论】:

    • 但是,如果我接受 varchars,我不会失去语言中立性吗?
    【解决方案2】:

    只有当您接受字符串作为日期时,您才能强制使用特定格式 - 然后,您可以尝试使用您的格式解析该字符串,如果失败则抛出错误。

    但是,如果您的存储过程接受 DATETIME 变量,则没有“格式” - 它只是一个具有值的变量。

    【讨论】:

      【解决方案3】:

      你的意思是这样的:

      IF   @arg NOT LIKE    '19[0-9][0-9]-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-5][0-9]:[0-5][0-9].[0-9][0-9][0-9]'
       AND @arg NOT LIKE '2[01][0-9][0-9]-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-5][0-9]:[0-5][0-9].[0-9][0-9][0-9]'
      RAISERROR('Wrong format', 10, 1)
      

      ?

      当然,仅当@arg 作为字符串传递时。

      【讨论】:

      • 有趣... 1299 是公认的年份,但不是 1300... ;) 我的日期通常也有月份和日期,不仅是年份和时间。
      • @Michel de Ruiter:缺少分隔符,所以 29991939 是有效日期,但不是 2010-12-13...
      • @Guffa:再次修复。我不明白我的头在哪里。
      • @Michel de Ruiter:它仍然接受奇怪的年份范围 1000-1199、1900-2199、2900-2999...
      【解决方案4】:

      只要用户提供任何有效的日期格式,你就应该接受。学习使用 CAST 和 CONVERT:

      http://msdn.microsoft.com/en-us/library/ms187928.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 2017-10-01
        • 1970-01-01
        相关资源
        最近更新 更多