2016-03-24 6 views
3
create procedure dummy2 
as 
begin 
declare @sDate datetime, 
     @eDate datetime 

select @sDate = '2013-02-25', 
     @eDate = '2013-03-25' 

;with cte as (


    select convert(datetime,left(convert(varchar,@sdate,112),6) + '01') startDate , 
     month(@sdate) n 
    union all 
    select dateadd(month,n,convert(datetime,convert(varchar,year(@sdate)) + '0101')) startDate, 
     (n+1) n 

    from cte 
    where n < month(@sdate) + datediff(month,@sdate,@edate) 
) 

select CONVERT(varchar(20), DATENAME(MONTH, startdate))as Months, startdate, dateadd(day,-1,dateadd(month,1,startdate)) enddate 
from cte 
end 

Months startdate enddate 
February 2013-02-01 00:00:00.000  2013-02-28 00:00:00.000 
March 2013-03-01 00:00:00.000 2013-03-31 00:00:00.000 

こんにちは私は開始日と終了日のリストを取得する必要があります。開始日と終了日が、私は数ヶ月のリストは、開始日と日付を終了neeeその日の間に、私は与えられたものです、月名SQLサーバの現在の月の名前、開始日、終了日を取得する方法

:結果はcorrect..iない

ノート以下のような結果を必要とします

月| |終了日


feburary | 2013-02-25 | 2013-02-28 3月| 2013-03-01 | 2013年3月25日

+0

あなたはme..suggestチュートリアル私のSQL Serverのスキルを向上させるために – Dejan

答えて

2

これは我々の使用日付ディメンションとして知られているテーブルのデータ・ウェアハウスであなた

declare @sDate datetime, 
     @eDate datetime 
select @sDate = '2013-02-21', 
     @eDate = '2013-04-25' 
;WITH CTE_TEST AS (
    SELECT @sDate SDATE,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@sDate)+1,0)) EDATE 
    UNION ALL 
    SELECT EDATE+1,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,DATEADD(MONTH,1,SDATE))+1,0)) 
    FROM CTE_TEST C WHERE DATEADD(MONTH,1,SDATE) < DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@eDate)+1,0)) 
) 
SELECT DATENAME(MONTH,SDATE) MNAME,SDATE,(CASE WHEN EDATE > @eDate THEN @eDate ELSE EDATE END) EDATE FROM CTE_TEST 
+0

として日付を使用して起動時間を必要としない場合は、plzは今 – yoges

+0

Edited.Queryが今簡略化されているため、これは便利ですデータ型 –

+0

@yogesスクリプトDATEADD(複数可、チェック-1、DATEADD(mm、DATEDIFF(m、0、@ sDate)+1,0))は、現在の月/ @ s日付の終了日*を取得するために使用されます。希望uは有用なこのクエリ、bcz uはすでにCTEを使用してこれに似た何かを行うことができます –

0

助けとなることがあり、これは、パフォーマンス、計算ミス、との真理の一つのポイントに役立ちます誰でもそのデータベースの日付を使用しています。もちろん、あなたが必要な日付についてのデータを追加することができますが、簡潔さのために、私は完全な日付とMONTHNAME追加しました:

DateKey DateFull DateMonthName

:ここ
CREATE TABLE DimDate 
(
    DateKey INT NOT NULL PRIMARY KEY CLUSTERED, 
    DateFull DATETIME NOT NULL, 
    DateMonthName VARCHAR(20) NOT NULL 
);     

は、いくつかのサンプルデータですが

20130201 2013年2月1日00:00:00.000 2月

20130202 2013年2月2日00:00:00.000 2月

次に、あなたのクエリは、このような単純な次のようになります。以下は

SELECT 
    Months = ddd.DateMonthName, 
    startDate = MIN(ddd.DateFull), 
    endDate = MAX(ddd.DateFull) 
FROM 
    dbo.DimDate ddd WITH(NOLOCK) 
WHERE 
    ddd.DateFull BETWEEN '2013-02-25' AND '2013-03-25' 
GROUP BY 
    ddd.DateMonthName; 

は、あなたの更新dummy2 procを次のとおりです。新しいテーブルにすべての結果を挿入について

CREATE PROCEDURE dummy2 
AS 
BEGIN 
    DECLARE 
     @sDate DATETIME, 
     @eDate DATETIME; 

    SELECT 
     @sDate = '2013-02-25', 
     @eDate = '2013-03-25'; 

    SELECT 
     Months = ddd.DateMonthName, 
     startDate = MIN(ddd.DateFull), 
     endDate = MAX(ddd.DateFull) 
    FROM 
     dbo.DimDate ddd WITH(NOLOCK) 
    WHERE 
     ddd.DateFull BETWEEN @sDate AND @eDate 
    GROUP BY 
     ddd.DateMonthName; 
END; 
0

どのように?

関連する問題