2017-06-13 7 views
-1

T-SQLを使用して、getdate()の今年の月の最初の日を表示する新しい列が必要です。 その後、この特定の日付に行を数える必要があります。私はCTEまたは一時テーブルでそれを行う必要がありますか?与えられた年の数ヶ月のアドホック表について現在のgetdateの各月の再帰的な初日

答えて

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に使用します。これらの番号は、年の始まりに月として追加されます。

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 
+0

おかげで作成された日付に参加になります!私は本当にこの簡単な解決に感謝します –

+0

ありがとう!あなたの考えの小さな説明を提供できますか? – Proffesore

+0

@Proffesore FROM部分は、フィールド名がNの12個のレコード(1-12)を生成します。次に、DateFromParts()でNを月として使用します。 ... DateFromPart(年、月、日)... –

関連する問題