2011-07-07 70 views
1

我有一個包含varchar格式的Date列的表。日期格式因使用我們的程序的計算機的日期格式而有所不同。例如,我有以下格式:將不同格式的varchar轉換爲日期

  1. 2010年10月7日
  2. 2010年7月11日上午7時36分55秒

我已經嘗試使用:

SELECT  CONVERT(DateTime, Date, 103) AS Expr1 
FROM   MyTable 

但是,對於以下行,我得到一個超出範圍的日期時間值例外:

7/13/2010 3:33:45 PM 

我需要一種方法將這些值轉換爲統一格式。時間和輸出格式並不重要,只要它具有可比性(當複製到Excel或其他東西時,它將在外部使用,所以我不介意不更改數據庫中的實際值)。
此數據庫是MSSQL 2005.

回答

2

您需要閱讀MSDN Books Online上的主題 - 主題:CAST and CONVERT

這會顯示所有可能的支持日期格式,例如:

CONVERT(VARCHAR(50), GETDATE(), 112) 

將今天的日期轉換爲ISO格式,你會得到20110707作爲輸出。

最大的兼容性,我推薦了ISO-8601日期格式:

YYYYMMDD 

YYYY-MM-DDTHH:MM:SS 

那些總是工作,可以隨時進行轉換,無論你的SQL Server的日期,區域和語言設置...

更新:

轉換現有的字符串轉換爲DATEDATETIME在很大程度上取決於你的語言/區域設置:

DECLARE @string1 VARCHAR(25) = '10.7.2010' 
DECLARE @string2 VARCHAR(25) = '7/11/2010 7:36:55 AM' 
DECLARE @string3 VARCHAR(25) = '7/13/2010 3:33:45 PM' 

SET DATEFORMAT MDY 

SELECT 
    CAST(@string1 AS DATE), 
    CAST(@string2 AS DATETIME), 
    CAST(@string2 AS DATETIME) 

結果這裏是:

2010-10-07 2010-07-11 07:36:55.000 2010-07-13 07:36:55.000 

日期被解釋爲2010年10月7日,2011年7月11日和2010年7月13日

SET DATEFORMAT dmy 

SELECT 
    CAST(@string1 AS DATE), 
    CAST(@string2 AS DATETIME) 

結果在這裏:

2010-07-10 2010-11-07 07:36:55.000 

日期被解釋爲2010年7月的第十屆和第7 2011年11月

當然的的,轉換@string3爲日期這些設置會失敗,因爲它試圖將其解釋爲第7第13個月.....並且沒有第13個月.....

由於這種含糊不清,我建議始終使用ISO-8601格式,這些格式清晰,標準化,總能正常工作,而且它總是定義爲什麼日期確實代表了什麼。

更新#2

當然,你也可以使用ISDATE()功能檢查,如果給定的字符串可以解釋爲一個有效日期:

SELECT DateStr, ISDATE(DateStr) FROM dbo.YourTable 

SET DATEFORMAT DMY的情況下,字符串值'7/13/2010 3:33:45 PM'將被識別爲無效:

SET DATEFORMAT DMY 
SELECT ISDATE('7/13/2010 3:33:45 PM') 

r作爲其值,會產生0

+1

同樣的問題是在這裏,我們如何區分'10.7.2010'是'MM.DD.YYYY'或'DD.MM.YYYY'。 –

+0

我可能會缺少一些東西:我試過'SELECT CONVERT(VARCHAR(50),Date,112)AS Expr1 FROM MyTable',但它不會改變值 - 各種格式依然存在。 – Noich

+0

@Talha艾哈邁德汗:這是問題之一 - 取決於你的語言設置,這可能是二者之一。這就是爲什麼我說:使用ISO-8601格式,這與您的語言和區域設置無關! –

0

我不發現轉換上述數值爲datetime轉換的任何誤差。 我認爲你的日期格式不正確。請分享這些數據以獲得更多幫助。 意味着同時檢查查詢來獲取日期值..

 
Declare @Table Table 
(
    DateTimeCol varchar(100) 
) 
insert into @Table 
Select '10.7.2010' UNION ALL 
Select '7/11/2010 7:36:55 AM' 

Select Convert(varchar,DateTimeCol,101) As Date 
From @Table 
+0

我可以轉換的最後一行是'13.7.2010',下面一行是'7/13/2010 3:33:45 PM',並且在這一行上我明白了。請注意,此處M/D訂單發生變化。還要注意,在你的例子中,有11個而不是13個,這可能是一天一個月,也許這是差別? – Noich

+0

你一定會得到13.7.2010轉換的例外,因爲這不是合適的日期時間格式。您需要將日期時間格式設置爲SET datetimeformat dmy –

相關問題