首页 > 解决方案 > 为什么 DATEDIFF 将这些日期解析为 dd/mm/yyyy?

问题描述

我愿意:

SELECT DATEDIFF(month, Convert(datetime,'01/10/2018',103), 
       Convert(datetime,'30/04/2019',103)) AS 'Month1', 
       DATEDIFF(month, '10/01/2018','04/30/2019') AS 'Months2', 
       DATEDIFF(month, '10/02/2018','05/01/2019') AS 'Months3' 

请告诉我为什么它返回 6,6,7?

标签: sqldatediff

解决方案


前 6 个是 01/10/2018(2018 年 10 月 1 日)和 30/04/2019(2019 年 4 月 4 日)之间的差值(以月为单位)。CONVERT 调用是强制使用日期格式 103(即英国/法语,即 dd/mm/yyyy)解析第二个日期,这让我怀疑您的 SQL 实现设置为将它们解析为其他格式(例如美国:mm/dd/yyyy)。

第二个 6 是 2018 年 10 月 1 日(2018 年 10 月 1 日)和 2019 年 4 月 30 日(2019 年 4 月 30 日)之间的差值(以月为单位)。

7 是 10/02/2018(2018 年 10 月 2 日)和 05/01/2019(2019 年 5 月 1 日)之间的差值(以月为单位)。这些日期可以解析为 2 月 10 日和 1 月 5 日,但事实并非如此,这证实了您的 SQL 实现正在解析 mm/dd/yyyy 格式的日期。

如果您确实将日期作为字符串传递,我建议使用明确的格式(例如“2018 年 10 月 1 日”),因为它会使代码更清晰,更不脆弱。


推荐阅读