DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
有人可以解释一下吗。
答案 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日以获得当月的开始