【问题标题】:SQL Server appears to correctly interpret non-supported string literal formatsSQL Server 似乎可以正确解释不受支持的字符串文字格式
【发布时间】:2019-10-07 22:49:09
【问题描述】:

有一个 SQL Server 2012 实例,该实例似乎可以正确解释其格式未在 docs 中列出的字符串文字日期(但请注意,这些文档适用于 SQL Server 2017)。

例如。我有一个 TSV,其中有一列日期格式为 %d-%b-%y(请参阅 https://devhints.io/datetime#date-1),看起来像“25-FEB-93”。但是,当尝试将数据复制到 SQL Server 表中时,这会引发类型错误(通过mssql-toolsbcp 二进制文件)。然而,在 SQL Server 中的另一个表上进行测试时,我可以执行类似...

select top 10 * from account where BIRTHDATE > '25-FEB-93'

没有任何错误。所有这一切,即使给定的格式没有在文档中列出可接受的日期格式,并且在写入新记录时它显然也不能用作可转换的字符串文字。谁能解释这里发生了什么?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    给定的格式未在文档中列出可接受的日期格式

    这意味着它不受支持,并且没有记录的行为。由于解析实现中的怪癖,在某些区域设置下,有很多字符串会转换。

    这是一个性能关键的代码路径,因此字符串格式在转换时没有经过严格验证。您应确保字符串采用受支持的格式。

    因此,您可能需要将该列加载为 varchar(n),然后对其进行转换。例如

    declare @v varchar(200) = '25-FEB-93'
    select convert(datetime,replace(@v,'-',' '),6)
    

    根据 docs 格式 6 是 dd mon YY,但请注意,此转换“有效”而不用 替换 -,但这是您观察到的行为的一个示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多