在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)