如何将字符串解析为日期?


Answers:




21

假设数据库为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+
Mark Kram

8

尽管“转换”功能有效,但您实际上不应该使用它。您应该问自己为什么在SQL Server中解析字符串值。如果这是一项一次性的工作,而您要手动修复一些数据,那么您下次再也不会获得该数据,那么可以,但是如果任何应用程序正在使用它,则应该进行一些更改。最好的方法是使用“日期”数据类型。如果这是用户输入,那就更糟了。然后,您应该首先在客户端中进行一些检查。如果您确实希望在SQL-Server期望日期的地方传递字符串值,则可以始终使用ISO格式('YYYYMMDD'),并且它应该自动转换。


5
如果您要从某个外部系统导入数据文件,而输入列恰好是其中一种格式,例如“ 05/31/2013”​​,但以字符串形式出现,该怎么办?例如,您正在编写存储过程以导入该数据,还是使用SSIS导入该数据?然后,使用CONVERT是合适的东西,不是吗?
David Barrows 2013年

不一定,在MS SQL Server主机分析数据模型(与事务模型相反)的情况下,完全可以使用CONVERT,因为它必须处理很多不容易作为日期类型输入的外部源。 (如David Barrows所提到的)。
2014年

日期的默认字符串文字格式为YYYY-MM-DD
YB


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

将执行所需的操作,结果:

2012-04-24 00:00:00.000

即使对于不同的语言设置,这对于OP发布的内容似乎也不起作用。尝试一下。如果它确实对您有用,请发布您当前的语言设置。谢谢。这是尝试的代码... SELECT CONVERT(DateTime,'24 .04.2012',121)AS ExpireDate
杰夫·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.