2009-10-02 272 views
56

如何在SQL Server 2008中将mmddyyyy格式的字符串转换为datetime在SQL Server中将varchar转换为datetime

我的目标列在DateTime

我试图与Convert和大多数Date样式值,但是我得到一个错误信息:

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

+1

tsql是否有像MySQL一样的str_to_date函数? http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_str-to-date – dnagirl 2009-10-02 15:00:50

+2

OP想要mmddyyyy;选择convert(datetime,'12312009') - >>> _ Msg 242,Level 16,State 3,Line 1将char数据类型转换为日期时间数据类型导致超出范围的日期时间值。 – 2009-10-02 15:04:59

回答

63

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) 
+2

+1,但是不必拼接字符串不是很好吗? http://www.techonthenet.com/oracle/functions/to_date.php – dwerner 2012-05-17 19:05:35

+9

@dwerner,如果你不想做这样的事情,那么不要存储在一个不正确的数据类型。 – HLGEM 2013-01-28 16:42:28

+2

纠正我,如果我错了,但这是问题提出的问题。我的建议是使用专为此目的而设计的功能。 – dwerner 2013-01-29 00:37:51

2

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

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

否则

CONVERT(datetime, '20090101') 

应该这样做。

这是一个link应该有所帮助:

4

转换将是正常的回答,但格式是不是该转换器可识别的格式,MM/DD/YYYY可以用转换转换(日期时间, 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) 
0

我觉得CONVERT是因为你可以包括样式(日期格式)的最佳选择,让美国违约将是110是MM-DD -YYYY。

4

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

好的我用已知的良好数据进行了测试,仍然收到了消息。您需要转换为其他格式,因为它不知道12302009是mmddyyyy还是ddmmyyyy。YYYYMMDD的格式也不含糊和SQL Server将其转换正确

我得到这个工作:

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

不过,如果您有任何有能力的非标准你仍然会得到一个错误信息格式如'112009'或一些文本值或真正的超出范围日期。

6

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 = @[email protected][email protected] 
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的做隐式转换的能力。

1

我有运气类似的东西:

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

这个问题的根本原因可能是在区域设置 - DB等待YYYY-MM-DD,而应用程序sents,例如,DD-MM -YYYY(俄语区域设置格式)与我的情况一样。我所做的 - 将语言环境从俄语改为英语(美国)和voilà。

0

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

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

SQL标准的日期,而插入或更新必须是1753年1月1日59:59 12/31/9999之间12:00:00 AM和下午。

所以,如果你插入/更新低于1753年1月1日,你会得到这个错误。

1

我会使用STUFF插入字符分割,然后用CONVERT提供相应的款式。事情是这样的:

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

首先使用两次STUFF获得90年11月12日,而不是111290,比你使用将其转换为datetime(或任何其他配件格式:使用.为德国,-英国...)More details on CAST and CONVERT

最好的是,以正确存储日期和时间值。

  • 这应该是“通用未分离格式” yyyyMMdd
  • 或(尤其是在XML)应该是ISO8601:yyyy-MM-ddyyyy-MM-ddThh:mm:ssMore details on ISO8601

任何文化特定的格式将比分追成麻烦迟早后来......

0

使用Try_Convert:返回转换为指定的数据类型,如果转换成功的值;否则,返回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)

相关问题