【问题标题】:Correct way of specifying a given date in T-SQL在 T-SQL 中指定给定日期的正确方法
【发布时间】:2012-01-21 00:20:08
【问题描述】:

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

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

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

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

【问题讨论】:

  • 快速反例set language british; DECLARE @epoch DATETIME; set @epoch='1900-01-25'; select min = ISNULL(CURRENT_TIMESTAMP,@epoch) 给出错误

标签: sql-server string tsql datetime


【解决方案1】:

基于字符串的日期的最佳格式是 ISO-8601 标准格式。

对于DATETIME 变量和列,这是YYYYMMDD(用于没有时间的日期;没有任何破折号!)或YYYY-MM-DDTHH:MM:SS(日期+时间)。

与普遍的看法相反,DATETIME 变量的YYYY-MM-DD 独立于语言/日期格式的!如果你试试这个,第二个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

【讨论】:

  • 我想 us_english,而不是 US_english 用于区分大小写的数据库
猜你喜欢
  • 2011-11-04
  • 2011-08-25
  • 2020-07-15
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多