DATEADD(月,DATEDIFF(月,0,GETDATE()),0)有人可以解释我这个

时间:2012-07-26 08:17:40

标签: sql-server-2008

DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)

有人可以解释一下吗。

5 个答案:

答案 0 :(得分:36)

这将为您提供给定日期的第一个月

内部选择 select DATEDIFF(MONTH, 0, GETDATE())将提供从1900-01-01开始的月数

这里是1350

这将添加到1900-01-01,但只有几个月

select DATEADD(MONTH,1350,0)将提供2012-07-01 00:00:00.000

这是本月的开始。

我认为这是找到任何特定日期的月份开始的最有效方式。

答案 1 :(得分:9)

DateDiff函数返回您在第一个日期(此处为0)和第二个日期(此处为当前日期)之间指定的间隔的秒数,月数,年数。

     DATEDIFF(MONTH, 0, '2-14-2015')  --returns month. 0 is for 1/1/1900, and getdate is the current date 
     --(i used a set date bc dates will change as this post gets older).
     result: 1381

在我的工作中,我使用了2015年2月14日的日期,它给了我自19/1年1月1日以来的1381个月。我将1381放入dateadd函数,就像这样......

     select Dateadd(MONTH, 1381, 0)
     result: 2015-02-01 00:00:00.000

基本上,它是在最里面的公式的日期中指定的任何月份的第一天。

我不得不弄清楚的代码更进了一步,从那个结果中减去了1秒钟,以便在11:59:59得到本月的最后一天...

     select DATEADD(s, -1, '2015-02-01 00:00:00.000')

所有拼凑的公式看起来像这样:

     DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,getdate())+1,0))

希望这有助于某人。 :)

答案 2 :(得分:2)

The DATEDIFF will give you date diff in month from January 1 1900 to current date
AND 
The DATEADD will add (DATEDIFF) results months to your last parameter of DATEADD

答案 3 :(得分:1)

  

DATEADD函数为您指定的日期添加间隔。对于   例如,如果SalesOrderHeader表中所有订单的到期日期   滑了3天,您可以通过以下方式获得新的日期   语句:

USE AdventureWorks;
GO
SELECT DATEADD(day, 3, DueDate)
FROM Sales.SalesOrderHeader;
GO
  

DATEDIFF函数计算dateparts中的时间段   在您指定的两个日期的第二个和第一个之间。换一种说法,   它找到两个日期之间的间隔。结果是有符号整数   值等于date2 - 日期部分中的date1。以下查询使用   2001年11月30日,查找过去的天数   在DueDate与该日期之间:

USE AdventureWorks;
GO
SELECT DATEDIFF(day, DueDate, 'Nov 30 2001')
FROM Sales.SalesOrderHeader;
GO



SELECT DATEDIFF(year, '20051220', '20060101')
SELECT DATEDIFF(month, '20051220', '20060101')
SELECT DATEDIFF(day, '20051220', '20060101')

答案 4 :(得分:0)

它正在开始当月。它计算自1900年1月以来的月数,并将它们添加到1900年1月1日以获得当月的开始