2012-12-12 220 views
1

一個愚蠢的問題,但我想澄清。我創建了具有像這樣一個日期參數的腳本:SQL Server(T-SQL)日期時間轉換

DECLARE @dateparam as datetime 
SET @dateparam = '01-01-2013 00:00:00' 

這看起來是工作當我測試它,即使日期字符串不是「正確」的格式yyyy-MM-dd hh:mm:ss。我將計算機的區域設置更改爲英文,並且腳本仍然按照本應該執行的操作進行。

這是因爲SQL Server 2008 R2,我在我的電腦中知道如何轉換日期,或者我可以遇到使用像我已經使用過的日期格式的麻煩?

回答

3

轉換01-01-2013不會暴露問題,如哪個01是月份,哪天是哪一天。

這不是一種安全的格式。

的安全格式(轉換爲datetime,而不是datetime2)爲:

YYYYMMDD        20121201 
YYYY-MM-DD'T'hh:mm:ss     2012-12-01T10:43:29 
YYYY-MM-DD'T'hh:mm:ss.mil    2012-12-01T10:43:29.337 

棒那些只有那些。 (這些例子都代表2012年12月1日)

或者,更好的是,如果可以避免的話,不要把日期當作字符串。例如,如果您是從.NET代碼調用SQL Server,請將代碼中的日期保存爲DateTime,並讓ADO.NET和SQL Server處理所需的任何翻譯以使它們變成datetime s--而無需將它們翻譯爲並從字符串。

+0

謝謝,這是我的預期,但想要確認:) – japesu

+0

@Damien那麼'YYYYMMDD hh:mm:ss'呢? – ErikE

+0

@Erike - 根據我的經驗沒有(證明)安全。目前我沒有服務器,但我建議嘗試將系統設置爲英國並轉換爲'datetime'並查看結果是否符合您的期望。我給出的3種格式已經過多年的驗證。 –

1

你正在從看起來像日期的東西進行隱式轉換,但事實上是一個字符串('01 -01-2013 00:00:00')。不要相信SQL Server能夠正確猜測字符串的格式,您應該通過指定格式來明確轉換。

這可以通過使用CONVERT(而不是CAST)並指定'樣式'來完成。這裏列出了不同的樣式:http://msdn.microsoft.com/en-us/library/ms187928.aspx

+0

嘿,謝謝。使用CONVERT是我將來需要做的事情。 – japesu