在SQL Server中将varchar转换为datetime

如何在SQL Server 2008 mmddyyyy格式的string转换为datetime时间?

我的目标列在DateTime

我已经尝试使用Convert和大部分Date样式值,但是我收到一条错误消息:

'将varchar数据types转换为date时间数据types导致超出范围的值。

OP想要mmddyy和一个普通的转换器将无法正常工作:

 select convert(datetime,'12312009') Msg 242, Level 16, State 3, Line 1 The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value 

所以试试这个:

 DECLARE @Date char(8) set @Date='12312009' SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2)) 

OUTPUT:

 ----------------------- 2009-12-31 00:00:00.000 (1 row(s) affected) 

SQL Server可以以'YYYYMMDD'的forms将string隐式转换为date时间 – 所有其他string必须显式转换。 这里有两个快速的代码块,将从你所说的forms进行转换:

版本1使用单位variables:

 BEGIN DECLARE @input VARCHAR(8), @mon CHAR(2), @day char(2), @year char(4), @output DATETIME SET @input = '10022009' --today's date SELECT @mon = LEFT(@input, 2), @day = SUBSTRING(@input, 3,2), @year = RIGHT(@input,4) SELECT @output = @year+@mon+@day SELECT @output END 

版本2不使用单位variables:

 BEGIN DECLARE @input CHAR(8), @output DATETIME SET @input = '10022009' --today's date SELECT @output = RIGHT(@input,4) + SUBSTRING(@input, 3,2) + LEFT(@input, 2) SELECT @output END 

这两种情况都依赖于sql server的隐式转换能力。

转换将是正常的答案,但格式不是转换器可识别的格式,mm / dd / yyyy可以使用转换(date时间,yourdatestring,101)转换,但你没有这种格式,所以它失败。

问题是格式不标准,你将不得不把它操纵到一个标准的转换可以从可用的理解。

如果你能保证格式的话,一起入侵

 declare @date char(8) set @date = '12312009' select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112) 

可能你有不好的数据,不能转换。 date不应该存储在varchar中,因为它允许date如ASAP或02/30/2009。 使用数据的isdate()函数来查找无法转换的logging。

好的,我用已知的良好数据进行了testing,仍然收到了消息。 您需要转换为不同的格式,因为它不知道12302009是mmddyyyy还是ddmmyyyy。 yyyymmdd的格式不是不明确的,SQL Server会正确转换它

我得到这个工作:

 cast( right(@date,4) + left(@date,4) as datetime) 

如果您有任何非标准格式(如“112009”或某些文本值或超出范围的date),仍会收到错误消息。

我发现这对我的转换很有帮助,没有string操作。 https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

 CONVERT(VARCHAR(23), @lastUploadEndDate, 121) 

yyyy-mm-dd hh:mi:ss.mmm(24h)是我需要的格式。

看看BOL中的CAST / CONVERT应该是一个开始。

如果你的目标列是datetime你不需要转换它,SQL会为你做。

除此以外

 CONVERT(datetime, '20090101') 

应该这样做。

这是一个应该帮助的链接 :

我有幸运过类似的东西:

 Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day) + '/' + CONVERT(VARCHAR(4), @Year)) 

我认为CONVERT是最好的select,因为你可以包含一个样式(date格式),所以美国的默认值是110,这是mm-dd-yyyy。

这个问题的根本原因可能在于区域设置 – 数据库在应用程序发送时等待YYYY-MM-DD,例如DD-MM-YYYY(俄语区域设置格式),就像我的情况一样。 我所做的 – 将语言环境的格式从俄语更改为英语(美国)和voilà。

这似乎是最简单的方法..

 SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','') 

插入或更新时的SQL标准date必须介于1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。

所以,如果你插入/更新1/1/1753以下,你会得到这个错误。

我会用STUFF来插入分隔字符,然后用适当的风格CONVERT 。 像这样的东西:

 DECLARE @dt VARCHAR(100)='111290'; SELECT CONVERT(DATETIME,STUFF(STUFF(@dt,3,0,'/'),6,0,'/'),3) 

首先,你使用两次STUFF得到11/12/90,而不是111290,比用3把它转换成datetime (或者其他适合的格式:use。for german, - for british …) 更多关于CAST and CONVERT细节CAST and CONVERT

最好的是正确存储date和时间值。

  • 这应该是“通用不分隔格式” yyyyMMdd
  • 或者(特别是在XML中)应该是ISO8601: yyyy-MM-dd或者yyyy-MM-ddThh:mm:ss 更多关于ISO8601

任何文化特定的格式迟早会导致麻烦…

使用Try_Convert:如果转换成功,则返回一个转换为指定数据types的值; 否则,返回null。

 DECLARE @DateString VARCHAR(10) ='20160805' SELECT TRY_CONVERT(DATETIME,@DateString) SET @DateString ='Invalid Date' SELECT TRY_CONVERT(DATETIME,@DateString) 

链接: MSDN TRY_CONVERT(Transact-SQL)