2017-05-24 157 views
0

我有2008此查询的SQL Server:日期格式问题2008

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

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

有什么解释吗?如何解决这个问题?

+3

尝试使用*修改* ** ISO-8601中性语言格式的表格中**日期的格式只能是字符串文字:'SELECT DATEADD(mm,-2,'20171005');'(格式是'YYYYMMDD' - 没有破折号,没有空格)。这对于所有**语言和区域设置都可靠地工作,适用于任何版本的SQL Server –

+0

'SELECT DATEADD(mm,-2,CAST('2017-05-10'as datetime))'会先投射日期时间,然后减去两个月。如果你可以格式化你的数据,@marc_s有一个很好的答案,否则你必须首先做一些CAST或CONVERT。 –

+0

谢谢,@marc_s。我在SQL Server 2012上进行了第一次测试,'DATEADD(mm,-2,'2017-05-10')'返回了'2017-03-10',这是我的预期。版本问题。 – sk001

回答

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)); 

你会得到不同的结果,这取决于你的语言/ dateformat设置:

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服务器可能会根据在 会话中生效的语言设置不同来解释 值。数据库管理员定义的每个登录都有一个与之关联的默认语言 ,除非明确将其更改为 ,否则该语言将成为 会话中的有效语言。您可以使用SET LANGUAGE命令将会话中的默认语言覆盖 ,但这通常不会修改,因为代码的某些方面可能依赖于用户的默认语言 。会话中的有效语言在幕后设置了几个 语言相关的设置,其中一个名为 DATEFORMAT,它确定SQL Server如何解释您在从字符串类型转换为 日期时输入的文件 和时间类型。 DATEFORMAT设置表示为字符d,m和y的组合 。例如, us_english语言设置将DATEFORMAT设置为mdy,而 英国语言设置将DATEFORMAT设置为dmy。您可以使用SET DATEFORMAT 命令覆盖会话中DATEFORMAT设置的 设置,但如前所述,通常不推荐更改与语言相关的设置 。例如,考虑文字 '02/12/2007'。 SQL Server可以将日期解释为二月 12,2007或2007年12月2日,当您将此文字转换为 以下类型之一:DATETIME,DATE,DATETIME2或DATETIMEOFFSET。 有效的LANGUAGE/DATEFORMAT设置是决定性因素。 要演示相同字符串 文字的不同解释,请运行以下代码。 SET LANGUAGE英国; SELECT CAST('02/12/2007'AS DATETIME); SET LANGUAGE us_english; SELECT CAST('02/12/2007'AS DATETIME);

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

下面的链接,你会发现与不同的日期/时间类型

-2

试试这个:SELECT DATEADD(毫米,-2, '2017年10月5日')=> 2017年3月10日