Sql server SQL Server会混淆日期时间的月份和日期

Sql server SQL Server会混淆日期时间的月份和日期,sql-server,datetime,format,date-formatting,Sql Server,Datetime,Format,Date Formatting,当我必须调试存储过程时,我经常跟踪使用SQL探查器进行的确切RPC调用。然后,我看一下调用存储过程时使用的变量声明,并使用这些声明调试过程 如果一个参数的数据类型为datetimeI,则声明变量如下: DECLARE @MyDate datetime = '2017-05-12 00:00:00' 请注意,这也是SQL探查器用于显示调用的格式 当我打印@MyDate时,我所期望的不是5月12日。相反,SQL Server将其解释为12月5日 屈服 Dec 5 2017 12:00AM 我如

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

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

DECLARE @MyDate datetime = '2017-05-12 00:00:00'
请注意,这也是SQL探查器用于显示调用的格式

当我打印
@MyDate
时,我所期望的不是5月12日。相反,SQL Server将其解释为12月5日

屈服

Dec  5 2017 12:00AM
我如何才能实现预期结果,即
PRINT@MyDate
产生
2017年5月12日12:00AM

更新:

按照注释中的要求,我将显示我从SQL分析器中提取的部分。探查器显示此调用:

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

收益率:
2017年5月12日12:00AM

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

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

SET DATEFORMAT DMY
PRINT @MyDate

收益率:
2017年5月12日12:00AM

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


我在10年前提交此文件是为了使用中性日期格式。请向上投票。

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


我在10年前提交此文件是为了使用中性日期格式。请向上投票。

在我的情况下,我必须使用
设置日期格式ymd
,然后它按预期工作在我的情况下,我必须使用
设置日期格式ymd
,然后它按预期工作为您的日期(yyyyymmdd)使用非模糊格式:
DECLARE@MyDate-datetime='20170512'
我的问题是从SQL分析器复制/粘贴。我希望这是正确的格式。我不想修改SQL事件探查器显示的声明。如果不想修改该语句,然后,我想您将不得不处理获得不明确结果的问题。元问题是:为什么SQL概要文件提供的变量声明语句在直接使用时是错误的?您的系统默认语言设置为什么?我在英国,因此,如果我试图打印2017-30-05的日期,我会得到日期时间超出范围的错误,如果我像您上面所做的那样尝试,我会得到5月12日,正如英国日期格式所期望的那样。请为您的日期使用非模糊格式(yyyymmdd):
DECLARE@MyDate-datetime='20170512'
我的问题是从SQL分析器复制/粘贴。我希望这是正确的格式。我不想修改SQL事件探查器显示的声明。如果不想修改该语句,然后,我想您将不得不处理获得不明确结果的问题。元问题是:为什么SQL概要文件提供的变量声明语句在直接使用时是错误的?您的系统默认语言设置为什么?我在英国,所以如果我试图打印2017-30-05的日期,我会得到日期时间超出范围的错误,如果我像你上面所说的那样尝试,我会得到5月12日,正如英国日期格式所期望的。很好的解释。谢谢顺便说一句,在我的例子中,我必须使用
setdateformatymd
,然后它就可以正常工作了。很好的解释。谢谢顺便说一句,在我的例子中,我必须使用
setdateformatymd
,然后它才能按预期工作。