我正在编写一些需要在某些空字段上强制执行最小日期值的T-SQL:
DECLARE @epoch DATETIME;
set @epoch='1900-01-01';
select min = ISNULL(ValidFromDate,@epoch)
字符串'1900-01-01'是否总是在任何环境中返回1900年1月1日的日期时间,或者SQL服务器是否会尝试根据本地文化规则解析字符串?
如果这还不够好,在T-SQL中指定特定日期/时间的推荐方法是什么?
答案 0 :(得分:12)
基于字符串的日期的最佳格式是 ISO-8601 标准格式。
对于DATETIME
变量和列,这可以是YYYYMMDD
(对于没有时间的日期;没有任何破折号!)或YYYY-MM-DDTHH:MM:SS
(日期+时间)。
与普遍看法相反,YYYY-MM-DD
变量的DATETIME
不语言/日期格式独立!如果您尝试此操作,则第二个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)
这是最好的格式,因为它不依赖于SQL Server中的语言和日期格式设置。
对于SQL Server 2008和类型DATE
的列(只是日期 - 没有时间),格式也可以是YYYY-MM-DD
(带破折号),并且适用于所有设置。
为什么DATE
和DATETIME
之间存在这样的差异超出我的范围 - 这就是现在的方式!
有关更多细节和示例,请参阅Tibor Karaszi的优秀The Ultimate Guide to the DateTime data types。