2011-12-15 112 views
4

我寫了一些T-SQL這就需要強制執行的最小日期值到一些空字段:正確方法

DECLARE @epoch DATETIME; 
set @epoch='1900-01-01'; 
select min = ISNULL(ValidFromDate,@epoch) 

是字符串「1900-01-01 '總是要在任何環境中返回1900年1月1日的日期時間,否則SQL服務器會根據當地的文化規則嘗試解析字符串?

如果這還不夠好,在T-SQL中指定特定日期/時間的推薦方式是什麼?

+1

Quick counter-example`set language british; DECLARE @epoch DATETIME; set @ epoch ='1900-01-25'; select min = ISNULL(CURRENT_TIMESTAMP,@ epoch)`給出錯誤 – 2011-12-15 09:35:09

+0

好的測試用例,謝謝! – MarcE 2011-12-15 10:05:11

回答

8

基於字符串日期的最佳格式是ISO-8601標準格式。

對於DATETIME變量和列,這是YYYYMMDD(沒有時間的日期;沒有任何破折號!)或YYYY-MM-DDTHH:MM:SS(日期+時間)。

與流行的看法相反,YYYY-MM-DD對於DATETIME變量是不是語言 -/dateformat獨立!如果你試試這個,第二CAST會導致錯誤:

SET LANGUAGE us_english 
SELECT CAST('2011-07-20' AS DATETIME) 

SET LANGUAGE british 
SELECT CAST('2011-07-20' AS DATETIME) 

,但是這將工作:

SET LANGUAGE british 
SELECT CAST('20110720' AS DATETIME) 

這是最好的格式,因爲它是indepdendent的語言和日期格式設置在SQL Server

對於SQL Server 2008和DATE(僅限日期 - 沒有時間)的列,格式也可以是YYYY-MM-DD(帶破折號),也適用於所有設置。

爲什麼DATEDATETIME之間存在這樣的差異超出了我的想象 - 這就是現在的樣子!

有關更多詳細信息和示例,請參閱Tibor Karaszi出色的The Ultimate Guide to the DateTime data types