TSQL使用dd-mm-yyyy和yyyy-mm-dd有什么区别

Gen*_*emo 4 t-sql sql-server

我有一个很基本的问题出于兴趣。在T-SQL(SSMS等)中,使用dd-mm-yyyyyyyy-mm-ddwhere语句之间的区别是“幕后” 。

例如,这两个查询给我不同的结果

select * from DB..table where application_date > '01-01-2019' and application_date < '01-06-2019' order by app_ID;

select * from DB..table where application_date > '2019-01-01' and application_date < '2019-06-01' order by app_ID;
Run Code Online (Sandbox Code Playgroud)

似乎第一个是第二个的子集。为了进行比较,第一个给了我83条记录,第二个给了我11000多个更改。

如果有人可以启发我,这将很有趣。

Zoh*_*led 5

datetime值的字符串表示形式取决于区域性。
例如,在美国,字符串表示格式为MM/dd/yyyy,而在英国为dd/MM/yyyy
这意味着SQL Server将datetime根据区域性设置将字符串文字转换为,特别是DATEFORMAT-除非字符串表示格式符合ISO 8601标准- yyyy-MM-ddTHH:mm:ssyyyyMMddTHHmmss

但是,DateTime数据类型存在一个鲜为人知的错误(或功能),当从格式为的字符串转换仅日期的值时yyyy-MM-dd,转换仍取决于区域性设置-从备用ISO 8601格式进行转换yyyyMMdd对于所有人来说都是绝对安全的日期时间数据类型。

这可能是因为该格式不是ISO 8601独有的-它还是ODBC规范格式的一部分yyyy-MM-dd HH:mm:ss-与ISO 8601几乎相同,只是在日期部分和日期之间使用空格而不是T作为分隔符时间部分。

此错误仅存在于DateTime数据类型中,这是为什么您总是喜欢使用更新和改进的DateTime2数据类型的几个原因之一。

有关更多信息,请阅读日期转换和区域性:DATE和DATETIME之间的差异。

TL; DR;
唯一可使用的安全字符串表示日期格式datetimeyyyyMMdd
所有其他格式的转换都取决于区域性,并且可能会产生错误或更糟糕的结果。

要点:

  • 当你可以,喜欢DateTime2datetime
  • 如果可以,最好避免使用的字符串表示形式datetime
  • 当您必须使用的字符串表示形式时datetime,请始终使用ISO 8601格式之一- yyyy-MM-ddTHH:mm:ssyyyyMMddTHHmmss
  • 当您DateTime只需要使用日期的字符串表示形式时,请始终使用yyyyMMdd