Wie eine Tabelle der Daten zwischen x und y in SQL Server 2005 erhalten
-
01-07-2019 - |
Frage
Ich will nur eine schnelle Art und Weise (und vorzugsweise nicht eine while-Schleife verwendet wird) von createing eine Tabelle jedes Datum zwischen Datum @x und Datum @y so kann ich auf einige Statistiken Tabellen Outer Join links, haben einige von denen keine Datensätze für bestimmte Tage dazwischen, so dass ich mit einem 0 fehlenden Tage markieren
Lösung
Streng genommen dies nicht genau Ihre Frage beantworten, aber es ist recht ordentlich.
Angenommen, Sie mit Angabe der Anzahl der Tage nach dem Startdatum leben können, dann ein Common Table Expression unter Verwendung gibt Ihnen:
WITH numbers ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM numbers WHERE n < 500 )
SELECT DATEADD(day,n-1,'2008/11/01') FROM numbers
OPTION ( MAXRECURSION 500 )
Andere Tipps
Ich denke, dass Sie könnte genauso gut tut es nur in einer while-Schleife. Ich weiß, es ist hässlich, aber es ist einfach und es funktioniert.
ich tat tatsächlich etwas ähnliches eine kleine Weile zurück, aber ich konnte nicht einen Weg gefunden, die nicht eine Schleife verwendet haben.
Das Beste, was ich bekam eine temporäre Tabelle war, und dann die gewünschten Tage wollte ich komme auf in.
Der Blog bduke verbunden ist nett, obwohl ich die temporäre Tabelle Lösung denken, ist vielleicht eine sauberere Lösung.
Ich habe eine andere Tabelle gefunden, die jeden Tag (es Besucher auf die Website) speichert, so wie über diese ...
Declare @FromDate datetime,
@ToDate datetime
Declare @tmpDates table
(StatsDate datetime)
Set @FromDate = DateAdd(day,-30,GetDate())
Set @ToDate = GetDate()
Insert Into @tmpDates (StatsDate)
Select
distinct CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
FROM tbl_visitorstats
Where visitDate between @FromDate And @ToDate
Order By CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
Select * FROM @tmpDates
Es ist auf der anderen Tabelle angewiesen ist für jeden Tag mit einem Eintrag ich will, aber es ist 98% wahrscheinlich werde da Daten für jeden Tag sein.
Eine leichte Drehung auf die Antwort gegeben, wie https://stackoverflow.com/a/95728/395440 . Ermöglicht Tage angegeben werden und berechnet auch auf das aktuelle Datum Bereich bis.
DECLARE @startDate datetime
SET @startDate = '2015/5/29';
WITH number ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM dates WHERE n < DATEDIFF(Day, @startDate, GETDATE()) )
SELECT DATEADD(day,n-1,@startDate) FROM number where
datename(dw, DATEADD(day,n-1,@startDate)) in ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
OPTION ( MAXRECURSION 500 )
Sie einfach die Schleife schreiben. Jemand hat eine Schleife für diese zu schreiben, sei es Sie -. Oder SQL Server
DECLARE @Dates TABLE
(
TheDate datetime PRIMARY KEY
)
DECLARE @StartDate datetime, @EndDate datetime
SELECT @StartDate = '2000-01-01', @EndDate = '2010-01-01'
DECLARE @LoopVar int, @LoopEnd int
SELECT @LoopEnd = DateDiff(dd, @StartDate, @EndDate), @LoopVar = 0
WHILE @LoopVar <= @LoopEnd
BEGIN
INSERT INTO @Dates (TheDate)
SELECT DateAdd(dd,@LoopVar,@StartDate)
SET @LoopVar = @LoopVar + 1
END
SELECT *
FROM @Dates
Just: WHERE col> Start-Datum und col