我寫了一些T-SQL這就需要強制執行的最小日期值到一些空字段:正確方法
DECLARE @epoch DATETIME;
set @epoch='1900-01-01';
select min = ISNULL(ValidFromDate,@epoch)
是字符串「1900-01-01 '總是要在任何環境中返回1900年1月1日的日期時間,否則SQL服務器會根據當地的文化規則嘗試解析字符串?
如果這還不夠好,在T-SQL中指定特定日期/時間的推薦方式是什麼?
我寫了一些T-SQL這就需要強制執行的最小日期值到一些空字段:正確方法
DECLARE @epoch DATETIME;
set @epoch='1900-01-01';
select min = ISNULL(ValidFromDate,@epoch)
是字符串「1900-01-01 '總是要在任何環境中返回1900年1月1日的日期時間,否則SQL服務器會根據當地的文化規則嘗試解析字符串?
如果這還不夠好,在T-SQL中指定特定日期/時間的推薦方式是什麼?
基於字符串日期的最佳格式是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
(帶破折號),也適用於所有設置。
爲什麼DATE
和DATETIME
之間存在這樣的差異超出了我的想象 - 這就是現在的樣子!
有關更多詳細信息和示例,請參閱Tibor Karaszi出色的The Ultimate Guide to the DateTime data types。
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
好的測試用例,謝謝! – MarcE 2011-12-15 10:05:11