2017-12-02 1 views
0

DatenAuswahl des Datumsbereich zwischen oder mehr

CREATE TABLE `employees_salaries` (
    `PK_salary` bigint(20) NOT NULL, 
    `PK_worker` bigint(20) NOT NULL, 
    `contract_start` date NOT NULL, 
    `contract_end` date NOT NULL, 
    `gross` decimal(10,2) NOT NULL, 
    `insurence_cost1` decimal(10,2) NOT NULL, 
    `insurence_cost2` decimal(10,2) NOT NULL, 
    `to_payout` decimal(10,2) NOT NULL, 
    `due` decimal(10,2) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

INSERT INTO `employees_salaries` (`PK_salary`, `PK_worker`, `contract_start`, `contract_end`, `gross`, `insurence_cost1`, `insurence_cost2`, `to_payout`, `due`) VALUES 
(1, 4, '2017-10-01', '2017-10-31', '1000.00', '137.10', '171.60', '768.24', '1171.60'), 
(2, 4, '2017-10-01', '2017-10-31', '2000.00', '274.20', '392.20', '1459.48', '2392.20'), 
(3, 15, '2017-08-01', '2017-09-08', '2000.00', '274.20', '392.20', '1418.88', '2392.20'), 
(4, 17, '2017-08-01', '2017-09-08', '2000.00', '274.20', '392.20', '1459.48', '2392.20'), 
(5, 9, '2017-08-01', '2017-09-08', '2826.12', '303.39', '433.95', '2058.08', '3260.07'), 
(6, 11, '2017-08-01', '2017-09-08', '2000.00', '274.20', '392.20', '1459.48', '2392.20'), 
(7, 5, '2017-08-01', '2017-09-08', '2000.00', '274.20', '392.20', '1418.88', '2392.20'), 
(8, 6, '2017-08-01', '2017-09-08', '2000.00', '274.20', '392.20', '1459.48', '2392.20'); 

Abfrage

set @dstart = "2017-10-01",@dend = "2017-10-30"; 

select employees_salaries.PK_worker , coalesce(sum(employees_salaries.gross),0) as p_am, coalesce(sum(insurence_cost1 + insurence_cost2),0) as incost 
     from employees_salaries 
     /* This example won't return reliable data 
     WHERE employees_salaries.contract_start  >= @dstart 
     and employees_salaries.contract_end <= @dend 
     */ 
    GROUP BY employees_salaries.PK_worker 

ich folgendes Ergebnis zu erreichen versuchen:

Szenario

  • Wir setzen den Zeitbereich für die Abfrage, für die Gehälter zeigen @dstart = "2017-10-01",@dend = "2017-10-30";

Logischerweise sollte es contract_start sein@dend,

contract_end zwischen unseren @dstart sein sollte sollte auch zwischen @ dstart@ dend sein, aber was ist, wenn contract_end ist zum Beispiel 2017-12-30? Es wird eine solche Logik erzeugen

ist 2017-12-30 zwischen 2017-10-01 und 2017-10-30? Antwort ist nein, weil es größer ist.

Es gilt möglicherweise auch für contract_start als auch: ist 2017-09-01 zwischen 2017-10-01 und 2017-10-30 ist? Nein, aber die contract_end liegt im Bereich von Tsd.

Die Frage ist, wie ein solches Szenario zu implementieren? Für Hinweise geschätzt

MCVE: https://www.db-fiddle.com/f/wAQ2eGfp2kCAdQ7QUBRYKp/3

+0

Ich bin nicht sicher, ich das Problem verstehen. Sie meinen, dass sowohl * mmonth * als auch * payout_date * im Datumsbereich liegen sollten? –

+0

Ich gehe davon aus, dass für die Logik mindestens ein sollte, aber durch das Szenario laufen, es ist nicht so einfach wie es aussieht, auch die Logik ein bisschen aufgeräumt –

+0

Suchen Sie nach einer Bereichsüberlappung? –

Antwort

0
set @dstart = "2017-10-01",@dend = "2017-10-30"; 

    select employees_salaries.PK_worker , coalesce(sum(employees_salaries.gross),0) as p_am, coalesce(sum(insurence_cost1 + insurence_cost2),0) as incost 
      from employees_salaries 

      WHERE 
      @dstart BETWEEN employees_salaries.contract_start AND employees_salaries.contract_end 
    OR @dend BETWEEN employees_salaries.contract_start AND employees_salaries.contract_end 
    OR @dstart >= employees_salaries.contract_start AND @dend <= employees_salaries.contract_end 


     GROUP BY employees_salaries.PK_worker 
Verwandte Themen