您需要閱讀MSDN Books Online上的主題 - 主題:CAST and CONVERT。
這會顯示所有可能的支持日期格式,例如:
CONVERT(VARCHAR(50), GETDATE(), 112)
將今天的日期轉換爲ISO格式,你會得到20110707
作爲輸出。
最大的兼容性,我推薦了ISO-8601日期格式:
YYYYMMDD
或
YYYY-MM-DDTHH:MM:SS
那些總是工作,可以隨時進行轉換,無論你的SQL Server的日期,區域和語言設置...
更新:
轉換現有的字符串轉換爲DATE
或DATETIME
在很大程度上取決於你的語言/區域設置:
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
。
同樣的問題是在這裏,我們如何區分'10.7.2010'是'MM.DD.YYYY'或'DD.MM.YYYY'。 –
我可能會缺少一些東西:我試過'SELECT CONVERT(VARCHAR(50),Date,112)AS Expr1 FROM MyTable',但它不會改變值 - 各種格式依然存在。 – Noich
@Talha艾哈邁德汗:這是問題之一 - 取決於你的語言設置,這可能是二者之一。這就是爲什麼我說:使用ISO-8601格式,這與您的語言和區域設置無關! –