SQL Server 2008中的日期格式问题

时间:2017-05-24 16:30:50

标签: sql-server date

我在SQL Server 2008中有这个查询:

SELECT DATEADD(mm, -2, '2017-05-10');

我今天运行了我的代码,并说结果看起来像2017-05-05'而不是2017-03-10'预期。似乎日期格式在转换之前变成yyyy-dd-mm并返回到yyyy-mm-dd以显示结果。

有没有解释?如何解决这个问题呢?

2 个答案:

答案 0 :(得分:0)

你在说什么不是日期格式问题,但日期时间问题,事实上,如果你尝试这个代码,你总是会得到同样的结果:

set dateformat ymd
SELECT DATEADD(mm, -2, cast('2017-05-10' as date));

set dateformat ydm
SELECT DATEADD(mm, -2, cast('2017-05-10' as date));

使用日期时间时,根据您的语言/日期格式设置,您会得到不同的结果:

set language us_english
SELECT DATEADD(mm, -2, '2017-05-10');

set language russian
SELECT DATEADD(mm, -2, '2017-05-10');

格式yyyy-mm-dd 在使用日期类型时是语言中立的,但在使用日期时时依赖于语言。

<强>解释

  

重要的是要注意一些日期和字符串的字符串格式   时间文字是依赖于语言的,意味着当你转换时   它们以日期和时间数据类型,SQL Server可能会解释   基于有效的语言设置,价值取决于   会话。数据库管理员定义的每个登录都有一个   与之关联的默认语言,除非更改   明确地说,那种语言成为了有效的语言   会话。您可以覆盖会话中的默认语言   使用SET LANGUAGE命令,但这通常不建议   修补,因为代码的某些方面可能依赖于用户的   默认语言。会话中的有效语言设置了几种   幕后的语言相关设置,其中一个叫做   DATEFORMAT,它确定SQL Server如何解释文件   在从字符串类型转换为a时输入   日期和时间类型。 DATEFORMAT设置表示为a   字符d,m和y的组合。例如,   us_english语言设置将DATEFORMAT设置为mdy,而   英国语言设置将DATEFORMAT设置为dmy。你可以覆盖   使用SET DATEFORMAT在会话中设置DATEFORMAT   命令,但如前所述,更改与语言相关的设置   一般不推荐。例如,考虑字面意思   '02 / 12 / 2007’ 的。 SQL Server可以将日期解释为2月   2007年12月12日或2007年12月2日,当您将此文字转换为其中之一时   以下类型:DATETIME,DATE,DATETIME2或DATETIMEOFFSET。   有效的LANGUAGE / DATEFORMAT设置是决定因素。   演示对相同字符串的不同解释   文字,运行以下代码。 SET LANGUAGE英国;选择   CAST(&#39; 02/12 / 2007&#39; AS DATETIME); SET LANGUAGE us_english;选择   CAST(&#39; 02/12 / 2007&#39; AS DATETIME);

相关文章:Working with Date and Time Data by Itzik Ben-Gan

点击链接后,您会找到不同日期/时间类型的语言中性格式的表格

答案 1 :(得分:-2)

试试这个:SELECT DATEADD(mm,-2,'2017-10-05')=&gt; 2017-03-10