mmddyyyy
的字符串转换为datetime
?目标列应为
DateTime
。我已经尝试使用
Convert
函数和大多数Date
样式值,但是我收到了一个错误消息:
'将varchar数据类型转换为datetime数据类型导致超出范围的值。'
mmddyyyy
的字符串转换为datetime
?DateTime
。Convert
函数和大多数Date
样式值,但是我收到了一个错误消息:
'将varchar数据类型转换为datetime数据类型导致超出范围的值。'
楼主需要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))
输出:
-----------------------
2009-12-31 00:00:00.000
(1 row(s) affected)
SQL Server可以将形如“YYYYMMDD”的字符串隐式转换为日期时间——所有其他字符串必须显式转换。以下是两个快速的代码块,可以将您所说的格式进行转换:
版本1使用单位变量:
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不使用单位变量:
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进行隐式转换的能力。
cast( right(@date,4) + left(@date,4) as datetime)
如果您的日期格式不是标准格式,例如 '112009' 或某些文本值或超出范围的日期,您仍然会收到错误消息。
我发现这对我的转换很有帮助,而且没有字符串操作。 https://learn.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(24小时)。
转换通常是正常的答案,但是该格式不是转换器识别的格式,mm/dd/yyyy可以使用convert(datetime,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)
请查看 BOL 中的 CAST
/ CONVERT
,这应该是一个好的开始。
如果您的目标列是 datetime
,则不需要进行转换,SQL 会自动处理。
否则
CONVERT(datetime, '20090101')
应该这样做。
这是一个链接,也应该有所帮助:
我会使用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
(或任何其他适合的格式:对于德国,请使用。
,对于英国,请使用-
...)有关CAST和CONVERT
的更多详细信息
最好的方法是正确存储日期和时间值。
yyyyMMdd
yyyy-MM-dd
或yyyy-MM-ddThh:mm:ss
有关ISO8601的更多详细信息任何特定于文化的格式迟早会导致麻烦...
DECLARE @DateString VARCHAR(10) ='20160805'
SELECT TRY_CONVERT(DATETIME,@DateString)
SET @DateString ='Invalid Date'
SELECT TRY_CONVERT(DATETIME,@DateString)
我在类似的事情上运气不错:
Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))
DECLARE @d char(8)
SET @d = '06082020' /* MMDDYYYY means June 8. 2020 */
SELECT CAST(FORMAT (CAST (@d AS INT), '##/##/####') as DATETIME)
返回的结果是 @d 中的原始日期字符串作为 DateTime。