在SQL Server中将varchar转换为datetime
如何在SQL Server 2008中将mmddyyyy
格式的字符串转换为datetime
?在SQL Server中将varchar转换为datetime
我的目标列在DateTime
我试图与Convert
和大多数Date
样式值,但是我得到一个错误信息:
“varchar数据类型为日期时间转换数据类型导致超出范围的值。'
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)
看看CAST
/CONVERT
在BOL应该是一个开始。
如果你的目标列是datetime
你不需要转换它,SQL会为你做。
否则
CONVERT(datetime, '20090101')
应该这样做。
这是一个link应该有所帮助:
转换将是正常的回答,但格式是不是该转换器可识别的格式,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)
我觉得CONVERT是因为你可以包括样式(日期格式)的最佳选择,让美国违约将是110是MM-DD -YYYY。
可能是你有坏的数据无法转换。日期不应存储在varchar中,因为它允许日期如ASAP或02/30/2009。对数据使用isdate()函数来查找无法转换的记录。
好的我用已知的良好数据进行了测试,仍然收到了消息。您需要转换为其他格式,因为它不知道12302009是mmddyyyy还是ddmmyyyy。YYYYMMDD的格式也不含糊和SQL Server将其转换正确
我得到这个工作:
cast(right(@date,4) + left(@date,4) as datetime)
不过,如果您有任何有能力的非标准你仍然会得到一个错误信息格式如'112009'或一些文本值或真正的超出范围日期。
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的做隐式转换的能力。
我有运气类似的东西:
Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))
这个问题的根本原因可能是在区域设置 - DB等待YYYY-MM-DD,而应用程序sents,例如,DD-MM -YYYY(俄语区域设置格式)与我的情况一样。我所做的 - 将语言环境从俄语改为英语(美国)和voilà。
这似乎是最简单的方法..
SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')
SQL标准的日期,而插入或更新必须是1753年1月1日59:59 12/31/9999之间12:00:00 AM和下午。
所以,如果你插入/更新低于1753年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-dd
或yyyy-MM-ddThh:mm:ss
More details on ISO8601
任何文化特定的格式将比分追成麻烦迟早后来......
使用Try_Convert:返回转换为指定的数据类型,如果转换成功的值;否则,返回null。
DECLARE @DateString VARCHAR(10) ='20160805'
SELECT TRY_CONVERT(DATETIME,@DateString)
SET @DateString ='Invalid Date'
SELECT TRY_CONVERT(DATETIME,@DateString)
我发现我的转换这是很有帮助的,没有字符串操作。 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(24小时)是我所需要的格式。
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
OP想要mmddyyyy;选择convert(datetime,'12312009') - >>> _ Msg 242,Level 16,State 3,Line 1将char数据类型转换为日期时间数据类型导致超出范围的日期时间值。 – 2009-10-02 15:04:59