2016-03-24 22 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 

Merhaba, başlangıç ​​tarihi ve bitiş tarihi listesini almam gerekiyor, ay adı bewteen iki tarih, yukarıdaki benim sorgum ancak sonuç correct..i Geçerli ay adı, başlangıç ​​tarihi ve bitiş tarihi, sql sunucusunda iki tarih arasındaki başlangıç ​​tarihi nasıl edinilir

altına not gibi bir analiz mi değildir: o gün arasında ben aylar listesini tarihini başlayan ve bitiş tarihi neee başlangıç ​​ve bitiş tarihi, i verilen hangi ayda adı

olduğunu

ay | başlangıç ​​tarihi | bitiş alanı


feburary | 2013-02-25 | 2013-02-28 mart | 2013-03-01 |

+0

Zaman me..suggest öğretici – Dejan

cevap

2

2013-03-25 Bu veri depolama biz tarih boyutu olarak bilinen bir tablo, bu performans, hesaplama yapılan hatalar ile gerçeğin tek bir noktadan için birlikte yardımcı olan bir kullanım olarak size

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

olarak tarihini kullanarak başlamak gerekmiyorsa, -1, DATEADD (mm, DATEDIFF (m, 0, @ sDate) +1,0)), geçerli ayın/son tarihin * bitiş tarihini * almak için kullanılır. Umarım bu sorguyu kullanabilirsin, bcz u zaten CTE kullanarak buna benzer bir şey yaptı – yoges

+0

Edited.Query şimdi basitleştirilmiş benim sql server becerilerini geliştirmek için bu faydalıdır, plz şimdi –

+0

komut DATEADD (s @yoges kontrol veri türü –

0

yardımcı olabilir Bu veritabanında bir tarih kullanan herkes. Elbette size gereken tarihleri ​​hakkında herhangi bir veri ekleyebilir, ancak e bakacak olursak, ben sadece tam tarih ve monthName ekledik:

DateKey DateFull DateMonthName

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

bazı örnek veriler var

20130201 2013/02/01 00: 00: 00.000 Şubat

20130202 2013/02/02 00: 00: 00.000 Şubat

Sonra sorgu bu kadar basit olur:

Aşağıda
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; 

güncellenmiş 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

Nasıl yeni tabloya Sonuçları ekleme hakkında?

İlgili konular