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

Hallo, ich brauche die Liste von Startdatum und Enddatum, Monatsname zwischen zwei Daten, oben ist meine Abfrage, aber die Ergebnis ist nicht correct..i muß das Ergebnis wie unterWie bekomme ich den aktuellen Monatsnamen, Startdatum und Enddatum zwischen zwei Daten in SQL Server

Anmerkung: das Start- und Enddatum ist, was ich gegeben, zwischen diesen Tagen i der Liste der Monate neee Startdatum und Enddatum, Monatsname

Monat | Startdatum | enddatum


feburary | 2013-02-25 | 2013-02-28 März | 2013-03-01 | 2013-03-25

+0

Wenn Sie nicht brauchen Zeit Typ mit Datum als Daten starten – Dejan

Antwort

2

Dies kann man

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

dies nützlich für me..suggest Tutorial meine SQL-Server-Fähigkeiten zu verbessern – yoges

+0

Edited.Query nun vereinfacht, PLZ-Überprüfung jetzt –

+0

@yoges Skript DATEADD (s, -1, DATEADD (mm, DATEDIFF (m, 0, @ sDate) +1,0)) wird verwendet, um das * Enddatum * des aktuellen Monats/@ sDate zu erhalten. Hoffe, Sie können diese Abfrage verwenden, bcz Sie bereits etwas ähnliches mit CTE getan –

0

In Data Warehousing werden helfen wir eine Anwendung eine Tabelle als Datum Dimension bekannt, diese mit Leistung, Rechenfehler und einem einzigen Punkt der Wahrheit trägt dazu bei, jemand, der ein Datum in dieser Datenbank verwendet. Sie können natürlich auch alle Daten über Daten hinzufügen, die Sie benötigen, aber der Kürze halber habe ich hinzugefügt nur das vollständige Datum und die Monthname:

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

Hier einige Beispieldaten:

DateKey DateFull DateMonthName


20130201 2013-02-01 00: 00: 00.000 Februar

20130202 2013.02.02 00: 00: 00.000 Februar

Dann wird Ihre Anfrage so einfach:

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; 

Im Folgenden finden Sie die aktualisierte 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

Wie wäre es, alle Ergebnisse in eine neue Tabelle einfügen?

Verwandte Themen