我在SQL Server 2008中有这个查询:
SELECT DATEADD(mm, -2, '2017-05-10');
我今天运行了我的代码,并说结果看起来像2017-05-05'而不是2017-03-10'预期。似乎日期格式在转换之前变成yyyy-dd-mm并返回到yyyy-mm-dd以显示结果。
有没有解释?如何解决这个问题呢?
答案 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