2009-10-02 306 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)

相關問題