【问题标题】:How to parse string into date?如何将字符串解析为日期?
【发布时间】:2012-05-05 11:18:30
【问题描述】:

如何在 T-SQL 中将字符串转换为日期?

我的测试用例是字符串:'24.04.2012'

【问题讨论】:

    标签: tsql sql-server-2005


    【解决方案1】:
    CONVERT(datetime, '24.04.2012', 104)
    

    应该做的伎俩。更多信息请看这里:CAST and CONVERT (Transact-SQL)

    【讨论】:

      【解决方案2】:

      Microsoft SQL Date Formats

      CONVERT(DateTime, DateField, 104)
      

      【讨论】:

        【解决方案3】:

        假设数据库是 MS SQL Server 2012 或更高版本,这里有一个可行的解决方案。基本语句包含内联 try-parse:

        SELECT TRY_PARSE('02/04/2016 10:52:00' AS datetime USING 'en-US') AS Result;
        

        这是我们在生产版本中实现的:

        UPDATE dbo.StagingInputReview
         SET ReviewedOn = 
             ISNULL(TRY_PARSE(RTrim(LTrim(ReviewedOnText)) AS datetime USING 'en-US'), getdate()),
         ModifiedOn = (getdate()), ModifiedBy = (suser_sname())
         -- Check for empty/null/'NULL' text
         WHERE not ReviewedOnText is null 
           AND RTrim(LTrim(ReviewedOnText))<>''
           AND Replace(RTrim(LTrim(ReviewedOnText)),'''','') <> 'NULL';
        

        ModifiedOn 和 ModifiedBy 列仅用于内部数据库跟踪目的。

        另请参阅这些 Microsoft MSDN 参考资料:

        【讨论】:

        • 这假设 OP 使用的是 Sql Server 2012+
        【解决方案4】:

        虽然 CONVERT 有效,但实际上你不应该使用它。您应该问自己为什么要在 SQL-Server 中解析字符串值。如果这是您手动修复某些数据的一次性工作,您将不会再次获得该数据,这没关系,但如果任何应用程序正在使用它,您应该更改一些内容。最好的方法是使用“日期”数据类型。如果这是用户输入,那就更糟了。然后你应该首先在客户端做一些检查。如果你真的想在 SQL-Server 需要日期的地方传递字符串值,你总是可以使用 ISO 格式 ('YYYYMMDD'),它应该会自动转换。

        【讨论】:

        • 如果您从某个外部系统导入数据文件,并且输入列恰好是其中一种格式,例如“05/31/2013”​​,但哪个以字符串形式出现?你正在编写一个存储过程来导入该数据,还是使用 SSIS 来导入它?那么 CONVERT 将是合适的使用方法,不是吗?
        • 不一定,在 MS SQL Server 托管分析数据模型的情况下,与事务模型相反,使用 CONVERT 是完全可以的,因为它必须处理许多不会很容易作为日期类型进入(正如上面提到的大卫巴罗斯)。
        • 日期的默认字符串文字格式为YYYY-MM-DD
        【解决方案5】:

        你可以使用:

        SELECT CONVERT(datetime, '24.04.2012', 103) AS Date
        

        参考: CAST and CONVERT (Transact-SQL)

        【讨论】:

        • 这很有趣。格式 103 为 dd/mm/yyyy,104 为 dd.mm.yyyy。
        【解决方案6】:
        CONVERT(DateTime, ExpireDate, 121) AS ExpireDate
        

        会做需要做的事,结果:

        2012-04-24 00:00:00.000
        

        【讨论】:

        • 即使对于不同的语言设置,这似乎也不适用于 OP 发布的内容。试试吧。如果它确实对您有用,那么请发布您当前的语言设置。谢谢。这是要尝试的代码... SELECT CONVERT(DateTime, '24.04.2012', 121) AS ExpireDate
        猜你喜欢
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 2013-08-10
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        相关资源
        最近更新 更多