使用DATEADD()哪种方法更准确?

时间:2014-08-11 09:09:50

标签: sql-server tsql dateadd

以下是在给定日期添加日期和月份的两种方法。两者似乎在逻辑上都是正确的,但返回不同的值。

第1列:添加月份和天数, 第2栏:添加天数,然后是几个月

DECLARE @d DATE = '20140128'

SELECT  DATEADD(DAY, 3, DATEADD(MONTH, 1, @d)) Add_Months_Days,  
        DATEADD(MONTH, 1, DATEADD(DAY, 3, @d)) Add_Days_Months

Results and fiddle

Add_Months_Days        Add_Days_Months
----------------       ----------------
2014-03-03             2014-02-28

我明白为什么会这样,而且两者都是合乎逻辑的。但是在我们需要同时在给定日期添加月份和日期的情况下,是否有标准的方法来执行此操作?

3 个答案:

答案 0 :(得分:0)

我相信他们都是正确的,但他们做了不同的事情。

MSDN states

  

如果datepart是月份,而日期月份的天数多于返回日期   月份和日期日在返回月份中不存在,最后一个月   返回月份的日期。

在第一个示例中,您首先将1个月添加到 20140128 ,使其 20140228 (有效日期),然后再添加3天,最后以 20140303 < /强>

在第二个示例中,您添加3天,获得 20140131 ,然后再添加1个月,但自2014年2月起仅有28天您将获得 20140228 因为dateadd操作返回上述月份的最后一天。

我不相信有一种标准的方法可以做到这一点,我认为这取决于具体的业务需求,但是我个人认为这样做可能会在一个月内完成并且后期结束日期可能是&#34更正确&#34;因为它似乎遵循意图(日月法似乎失去了几天)。

答案 1 :(得分:0)

它们都是合乎逻辑的,但会返回不同的结果,因为您的问题中隐含的是将月末结果截断到月末,如果它超过一个月的边界。你在第二个查询中有这个,但不是第一个。

答案 2 :(得分:0)

  

将MONTH(1)添加到日期(&#34; 20140128&#34;),不会添加该月的总天数(1月31日,2月28日或29日等)。它将将给定的MONTH值(1)添加到输入日期,结果将为&#34; 20140228&#34;。

请参阅 Question and Answer