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

Mar*_*rcE 6 t-sql sql-server string datetime

我正在编写一些需要在某些空字段上强制执行最小日期值的T-SQL:

DECLARE @epoch DATETIME;
set @epoch='1900-01-01';
select min = ISNULL(ValidFromDate,@epoch)
Run Code Online (Sandbox Code Playgroud)

字符串'1900-01-01'是否总是在任何环境中返回1900年1月1日的日期时间,或者SQL服务器是否会尝试根据本地文化规则解析字符串?

如果这还不够好,在T-SQL中指定特定日期/时间的推荐方法是什么?

mar*_*c_s 13

基于字符串的日期的最佳格式是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)
Run Code Online (Sandbox Code Playgroud)

但这会奏效:

SET LANGUAGE british
SELECT CAST('20110720' AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

这是最好的格式,因为它不依赖于SQL Server中的语言和日期格式设置

对于SQL Server 2008和类型的列DATE(只是日期 - 没有时间),格式也可以YYYY-MM-DD(使用破折号),并且也适用于所有设置.

为什么会有之间的这种差异DATEDATETIME我是无法理解-这只是它现在的样子!

有关更多详细信息和示例,请参阅Tibor Karaszi的出色的DateTime数据类型的终极指南.