2016-09-21 7 views
-1

Angenommen, Sie ein Zimmer haben, die 100sqft ist und Sie wollen es aus 1. August Buchungen TabellenschemaFinden der Bereich zur Verfügung für den Datumsbereich

startdate|enddate|area|storageid 

Sie haben folgende Buchungen

bis 31. August mieten
06-Aug|25-Aug|50|'abc' 
05-Aug|11-Aug|40|'xyz' 
18-Aug|23-Aug|30|'pqr' 
13-Aug|16-Aug|10|'qwe' 

Jetzt bittet jemand um Buchung von 08-Aug bis 20-Aug. Für diesen Datumsbereich ist die maximale verfügbare Fläche 10sqft (Da für die Daten 8,9,10 und 11 Aug nur 10sq ft verfügbar ist)

Wie würden Sie eine effiziente SQL-Abfrage erstellen, um dies zu erhalten? Im Moment habe ich sehr chaotische und ineffiziente Abfragen, die in einigen Fällen falsche Ergebnisse liefern. Ich schreibe die Abfrage nicht, weil es so unordentlich ist, dass ich es selbst nicht erklären kann.

Ich möchte es nicht unbedingt nur mit SQL lösen. Wenn es einen Algorithmus gibt, der es effizient lösen kann, würde ich alle Daten aus der Datenbank extrahieren.

+2

Wer auf diese Weise aktuelle Daten des Sparens ausdenken? – Drew

+1

Mysql und SQL Server sind 2 verschiedene Produkte. Bitte entfernen Sie das irrelevante Produkt-Tag. Bitte geben Sie auch an, was Sie versucht haben und welche Probleme Sie haben. Im Moment ist Ihre Frage mehr like: e gib mir den Code. Es gibt einige Fragen zu SO bezüglich Reservierungen. Hast du sie überprüft? – Shadow

+0

@Drew: Ignoriere das Format für Datumsangaben. Ich spare Daten im YYYY-MM-DD-Format –

Antwort

0

Jemand entfernt SQL Server, aber hier ist der Algorithmus:

DECLARE @startDate date = '2016-08-09'; 
DECLARE @endDate date = '2016-08-20'; 
DECLARE @totalArea decimal(19,2) = 100; 

WITH Src AS --Your source table 
(
    SELECT * FROM (VALUES 
    ('2016-08-06', '2016-08-25', 50, 'abc'), 
    ('2016-08-05', '2016-08-11', 40, 'xyz'), 
    ('2016-08-18','2016-08-23',30,'pqr'), 
    ('2016-08-13','2016-08-16',10,'qwe') 
    )T(startdate, enddate, area, storageid) 
), Nums AS --Numbers table 0..N, N must be greater than ranges calculated 
(
    SELECT 0 N 
    UNION ALL 
    SELECT N+1 N FROM Nums 
    WHERE N<DATEDIFF(DAY,@startDate,@endDate) 
) --Query 
--You can use total-maxUsed from range of days 
SELECT @totalArea-MAX(Used) FROM 
(
    --Group by day, sum all used areas 
    SELECT MidDate, SUM(Used) Used FROM 
    (
     --Join table with numbers, split every day, if room used, return area 
     SELECT DATEADD(DAY, N, @startDate) MidDate, CASE WHEN DATEADD(DAY, N, @startDate) BETWEEN startDate AND endDate THEN area END Used 
     FROM Src 
     CROSS APPLY Nums 
    ) T 
    GROUP BY MidDate 
) T 
+0

Das war jemand der OP. Dies bedeutet wahrscheinlich, dass das OP MySQL verwendet. – Shadow

+0

Ich lasse dies, da keine anderen Antworten erschienen, als eine algorithmische Lösung. Der wichtigste Teil unter "--Query" ist fast universal (außer Parameter und 'DATEADD') –

Verwandte Themen