递归当前getdate每个月的第一天

时间:2017-06-13 12:51:07

标签: sql-server tsql

使用T-SQL,我想要一个新列,它将显示每月的第一天,当前年份为getdate()。 之后我需要计算这个特定日期的行数。我应该用CTE还是临时表来做?

4 个答案:

答案 0 :(得分:2)

如果是2012+,您可以使用 DateFromParts()

获取日期列表

// matrix contains offset relative to browser window
// as properties e and f
var ctm = svg.getScreenCTM();
// mouse positions relative to browser window
var x = e.clientX - ctm.e,
    y = e.clientY - ctm.f;

<强>返回

Select D = DateFromParts(Year(GetDate()),N,1) 
 From (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) N(N)
  

编辑换算

获取交易(按月计算)。创建日期

是左连接的一个小问题
D
2017-01-01
2017-02-01
2017-03-01
2017-04-01
2017-05-01
2017-06-01
2017-07-01
2017-08-01
2017-09-01
2017-10-01
2017-11-01
2017-12-01

返回

-- This is Just a Sample Table Variable for Demonstration.  
-- Remove this and Use your actual Transaction Table
--------------------------------------------------------------
Declare @Transactions table (TransDate date,MoreFields int)
Insert Into @Transactions values
 ('2017-02-18',6)
,('2017-02-19',9)
,('2017-03-05',5)


Select TransMonth = A.MthBeg
      ,TransCount = count(B.TransDate)
 From (
        Select MthBeg = DateFromParts(Year(GetDate()),N,1) 
              ,MthEnd = EOMonth(DateFromParts(Year(GetDate()),N,1))
         From (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) N(N)
      ) A
 Left Join @Transactions B on TransDate between MthBeg and MthEnd
 Group By A.MthBeg

答案 1 :(得分:1)

对于特定年份的特定月份表:

declare @year date = dateadd(year,datediff(year,0,getdate() ),0)
;with Months as (
  select 
      MonthStart=dateadd(month,n,@year)
  from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) t(n)
)
select MonthStart
from Months

rextester演示:http://rextester.com/POKPM51023

返回:

+------------+
| MonthStart |
+------------+
| 2017-01-01 |
| 2017-02-01 |
| 2017-03-01 |
| 2017-04-01 |
| 2017-05-01 |
| 2017-06-01 |
| 2017-07-01 |
| 2017-08-01 |
| 2017-09-01 |
| 2017-10-01 |
| 2017-11-01 |
| 2017-12-01 |
+------------+

第一部分:dateadd(year,datediff(year,0,getdate() ),0)1900-01-01以后的年数添加到日期1900-01-01。所以它将返回一年中的第一个日期。您还可以将year换成其他级别的截断:年,季,月,日,小时,分钟,秒等等。

第二部分使用common table expressiontable value constructor (values (...),(...))来源数字0-11,这些数字在年初添加为月份。

答案 2 :(得分:0)

不确定为什么要求递归...但是对于月份的第一天,您可以尝试如下查询:

Select Dateadd(day,1,eomonth(Dateadd(month, -1,getdate())))

答案 3 :(得分:0)

declare @year date = dateadd(year,datediff(year,0,getdate() ),0)
;WITH months(MonthNumber) AS
(
SELECT 0
UNION ALL
SELECT MonthNumber+1 
FROM months
WHERE MonthNumber < 11
)
select  dateadd(month,MonthNumber,@year)
from months