我有一个很基本的问题出于兴趣。在T-SQL(SSMS等)中,使用dd-mm-yyyy
和yyyy-mm-dd
where语句之间的区别是“幕后” 。
例如,这两个查询给我不同的结果
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多个更改。
如果有人可以启发我,这将很有趣。
datetime
值的字符串表示形式取决于区域性。
例如,在美国,字符串表示格式为MM/dd/yyyy
,而在英国为dd/MM/yyyy
。
这意味着SQL Server将datetime
根据区域性设置将字符串文字转换为,特别是DATEFORMAT
-除非字符串表示格式符合ISO 8601标准- yyyy-MM-ddTHH:mm:ss
或yyyyMMddTHHmmss
。
但是,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;
唯一可使用的安全字符串表示日期格式datetime
为yyyyMMdd
。
所有其他格式的转换都取决于区域性,并且可能会产生错误或更糟糕的结果。
要点:
DateTime2
过datetime
。datetime
。datetime
,请始终使用ISO 8601格式之一- yyyy-MM-ddTHH:mm:ss
或yyyyMMddTHHmmss
DateTime
只需要使用日期的字符串表示形式时,请始终使用yyyyMMdd
。