SQL 服务器混淆了日期时间的月份和日期

SQL Server confuses month and day of datetime

当我必须调试存储过程时,我经常跟踪使用 SQL 探查器进行的确切 RPC 调用。然后我查看调用存储过程时使用的变量声明,并使用这些声明来调试过程。

如果一个参数的数据类型为datetime 我声明变量如下:

DECLARE @MyDate datetime = '2017-05-12 00:00:00'

请注意,这也是 SQL Profiler 用来显示调用的格式。

然后当我打印 @MyDate 时,它不是我期望的 5 月 12 日 。相反,SQL 服务器将其解释为 12 月 5 日

SET DATEFORMAT DMY
PRINT @MyDate

产量

Dec  5 2017 12:00AM

我怎样才能达到预期的结果,即 PRINT @MyDate 产生 May 12 2017 12:00AM

更新:

根据评论中的要求,我展示了我从 SQL Profiler 中提取的部分。探查器显示此调用:

exec NAME_OF_STORED_PROCEDURE @MyDate'2017-05-12 00:00:00'

然后我使用 @MyDate'2017-05-12 00:00:00' 并将其更改为 DECLARE @MyDate = '2017-05-12 00:00:00'

删除破折号,这样您就可以消除日期格式中的歧义:

DECLARE @MyDate datetime = '20170512 00:00:00'

SET DATEFORMAT DMY
PRINT @MyDate

产量:May 12 2017 12:00AM

通过 RPC 调用传递的参数以本机(二进制)格式发送到 SQL 服务器。您在探查器(或扩展事件可视化)中看到的文本只是通过 TDS 协议传递的本机值的逆向工程呈现。不幸的是,显示的字符串格式不是中性 ISO 日期,因此如果您 copy/paste 文本,则需要手动调整格式。

我在 feedback suggestion on connect 10 年前使用中性日期格式提交了此文件。请点赞。

我必须在我的案例中使用 SET DATEFORMAT ymd,然后它按预期工作