在SQL Server中将varchar转换为datetime

Dev*_*per 63 sql t-sql sql-server type-conversion sql-server-2008

如何将一串格式mmddyyyy转换datetime为SQL Server 2008?

我的目标栏是在 DateTime

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

'将varchar数据类型转换为日期时间数据类型会导致超出范围的值.

KM.*_*KM. 72

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
Run Code Online (Sandbox Code Playgroud)

试试这个:

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

OUTPUT:

-----------------------
2009-12-31 00:00:00.000

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

  • @dwerner,如果你不想做那样的事情,那就不要存储在一个不正确的数据类型中. (11认同)
  • +1,但是不必拼接字符串不是很好吗?http://www.techonthenet.com/oracle/functions/to_date.php (2认同)
  • 如果我错了,请纠正我,但那是问题提出的问题.我的建议是使用为此目的量身定制的功能. (2认同)

小智 7

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
Run Code Online (Sandbox Code Playgroud)

版本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
Run Code Online (Sandbox Code Playgroud)

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


And*_*rew 5

Convert 将是正常的答案,但该格式不是转换器可识别的格式,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)
Run Code Online (Sandbox Code Playgroud)


HLG*_*GEM 5

您可能有无法转换的错误数据。日期不应存储在 varchar 中,因为它允许诸如 ASAP 或 02/30/2009 之类的日期。对您的数据使用 isdate() 函数来查找无法转换的记录。

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

我得到了这个工作:

cast( right(@date,4) + left(@date,4) as datetime)
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*mes 5

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

CONVERT(VARCHAR(23), @lastUploadEndDate, 121)
Run Code Online (Sandbox Code Playgroud)

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