在T-SQL中指定给定日期的正确方法

时间:2011-12-15 09:27:12

标签: sql-server string tsql datetime

我正在编写一些需要在某些空字段上强制执行最小日期值的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 个答案:

答案 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(带破折号),并且适用于所有设置。

为什么DATEDATETIME之间存在这样的差异超出我的范围 - 这就是现在的方式!

有关更多细节和示例,请参阅Tibor Karaszi的优秀The Ultimate Guide to the DateTime data types