使用T-SQL,我想要一个新的列,它会显示每个月的第一天,当前年份的getdate()。 之后,我需要计算这个特定日期的行。我应该使用CTE还是临时表?当前getdate的每个月的第一天递归
-1
A
回答
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,这是作为月份添加到年初。
0
不知道为什么你需要递归...但对于一个月的第一天,你可以尝试查询象下面这样:
Select Dateadd(day,1,eomonth(Dateadd(month, -1,getdate())))
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
2
如果2012+,你可以使用DateFromParts()
至获取日期的列表
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
返回
TransMonth TransCount
2017-01-01 0
2017-02-01 2
2017-03-01 1
2017-04-01 0
2017-05-01 0
2017-06-01 0
2017-07-01 0
2017-08-01 0
2017-09-01 0
2017-10-01 0
2017-11-01 0
2017-12-01 0
相关问题
- 1. 每个月的第一天
- 2. SQL得到每个月的第一天当月
- 3. 当前月份第一天的日期和提前5天的日期。 MySQL的
- 4. SQL返回第一天,每月的表
- 5. 如何在每月的第一天添加1个月至datetimepicker?
- 6. PHP - MYSQL:每月最后12个月的第一天到最后一天
- 7. 如何获得当月的第一天?
- 8. 获取当月的第一天-1个月
- 9. 当天+ N天下个月或上个月的一天
- 10. Pickadate - 每个月的第一天开始月份,而不是一周的第一天
- 11. SQL SELECT每月的第一天和最后一天。
- 12. 如何查找db2当前月份的第28个月到第27个月的天数
- 13. 同一个月的第一天
- 14. 如何在R中的每个月获得10个第一天
- 15. SQL检索数据从一年前的一个月的第一天到今天
- 16. Python的日历,数周的空天前的第一个月
- 17. 得到的天数在每月的第一个星期在PHP
- 18. 鉴于NSDate,找到第四个前个月的最后一天
- 19. 当月的第一天和最后一天
- 20. 查询当月的第一天和最后一天
- 21. 本月的第一天
- 22. 获取月的第一天
- 23. 如何获得当月的时间戳,一个月的第一天,零时
- 24. 每个月的第1天只插入一次数据
- 25. EJB 3.0 TimerService - 在每个月的第一天运行计时器
- 26. 在每个月的第一天开始工作流程
- 27. 计划函数在每个月的第一天运行
- 28. Quartz.net - 在每m个月的第n天重复一次?
- 29. 在jQuery-ui Datepicker中突出显示每个月的第一天
- 30. 上个月第一天的Excel公式
的感谢!我真的很感谢这个简单的解决方案 –
谢谢!你能提供一个你的想法的小解释吗? – Proffesore
@Poffesore FROM部分生成12个记录(1-12),字段名称为N.然后我们简单地使用N作为DateFromParts()中的月份。 ... DateFromPart(年,月,日)... –