2017-09-12 3 views
-1

Ich muss die Daten für bestimmte Datumsbereich z. von 2010 bis 2050 Ich googelte aber nicht die Lösung gefunden. Wie kann ich den Datumsbereich mithilfe von SQL Server generieren? Ich muss mit SQL-Abfrage nicht gespeicherte Prozedur und Block verwenden verwenden. Jede Hilfe wird zu schätzen wissen.Generieren Sie Daten für bestimmte Bereich mit SQL Server

Dank

Antwort

1

erstellen Zahlen/tally Tabelle (eine Tabelle mit Werten von 0 bis 10.000, sagen wir mal), nennen Sie es dbo.Numbers, dann von dort aus, um ein Datum aus jeder Zahl zu berechnen, beginnend bei 1 und bis zu welcher Nummer, die Sie brauchen:

SELECT DATEADD(day, n.Number, '2010-01-01') 
FROM dbo.Numbers AS n 
WHERE n < [YourMaxNumberHere] 
0

Sie rekursive CTE können Termine zwischen bestimmtem Zeitraum zu generieren, aber es ist ratsam, calendar Tabelle zu verwenden, die schneller und weniger komplexe Lösung sein kann.

Demo mit begrenztem Zeitraum - http://rextester.com/XXUVO70452

Declare @StartDate as DATE = '2010-01-01' 
     ,@EndDate as DATE = '2050-12-31' 

;WITH DateRange As 
(
SELECT @StartDate as N 
UNION ALL 
SELECT DATEADD(DAY, 1, N) 
FROM DateRange 
WHERE DATEADD(DAY, 1, N) < @EndDate 
)  

SELECT * From DateRange OPTION (MAXRECURSION 15000); 
+0

40 Jahre sind 14,310 Tage - ich würde einen Stapelfehler von dieser tiefen Rekursion erwarten. – Brian

+0

@Brian bearbeitet, machte es 15000, ich habe nicht die Lösung mit maxrecusion (0) getestet, schrieb es, oben auf meinem Kopf. –

0

Zahlen zu verwenden ist besser, aber Sie würden ein DB-Objekt erstellen müssen. Sie können auch

DECLARE @tbl TABLE(
DateValue DATETIME 
) 

DECLARE @startDate DATETIME = '2010-01-01' 
DECLARE @endDate DATETIME = '2050-01-01' 

DECLARE @seqDays INT; 
SELECT @seqDays = DATEDIFF(d, @startDate,@endDate) 

DECLARE @val INT = 1 
WHILE(@val <= @seqDays) 
BEGIN 
INSERT INTO @tbl VALUES(DATEADD(day, @val, @startDate)) 
SET @val = @val + 1 
END 

SELECT * FROM @tbl 

Oder für die Zahlen Tabelle Option eine einfache Tabelle Variable und eine while-Schleife verwenden, in einer anderen Antwort, beschrieben von @Dymeng, können Sie Ihre eigenen Tabellenvariable erstellen und mit diesem verbinden. Du hättest SEQUENCE auch verwenden können, aber das wird für eine einfachere Sache übertrieben sein.

DECLARE @tbl TABLE(
    DateValue DATETIME 
) 

DECLARE @startDate DATETIME = '2010-01-01' 
DECLARE @endDate DATETIME = '2050-01-01' 

DECLARE @seqDays INT; 
SELECT @seqDays = DATEDIFF(d, @startDate,@endDate) 
DECLARE @tbl TABLE(
DateInc INT IDENTITY(1,1) 
) 

DECLARE @val INT = 1 
WHILE(@val <= @seqDays) 
BEGIN 
INSERT INTO @tbl DEFAULT VALUES 
SET @val= @val + 1 
END 

SELECT DATEADD(day, a.DateValue, @startDate) FROM @tbl a 
0

Mit Hilfe einiger Mathe, können wir genügend Zahlen erzeugen, um Daten zu generieren.

DECLARE @BeginDate DATETIME ='20100101' 
DECLARE @EndDate DATETIME ='20500101' 
DECLARE @Day INT = DATEDIFF(DAY, @BeginDate, @EndDate); 
DECLARE @P INT = FLOOR(LOG(@Day, 2)) 

;WITH Base AS (SELECT * FROM (VALUES(1),(2)) N (ID)) 
,Numbers AS (
    SELECT 1 I FROM Base 
    UNION ALL 
    SELECT I+1 AS I FROM Base CROSS JOIN Numbers WHERE I < @P 
) 
, DateRange AS 
(
    SELECT DATEADD(DAY, ROW_NUMBER() OVER(Order BY I), @BeginDate) DateValue FROM Numbers 
) 

SELECT * FROM DateRange WHERE DateValue < @EndDate 
Verwandte Themen