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