我有一个很基本的问题出于兴趣。在T-SQL(SSMS等)中,使用dd-mm-yyyy和yyyy-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;
似乎第一个是第二个的子集。为了进行比较,第一个给了我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或yyyyMMddTHHmmssDateTime只需要使用日期的字符串表示形式时,请始终使用yyyyMMdd。