/ / MySql manipulowanie zakresem dat [closed] - mysql, sql, arytmetyka daty

MySql manipulowanie zakresem dat [closed] - mysql, sql, arithmetic daty

Przykład tabeli

ROW-------|---ID---|---FROM_DATE-------|---TO_DATE------|---PRICE---

1---------|---10---|---2014-02-01------|---2014-02-28---|---150.00---

2---------|---22---|---2014-01-10------|---2014-02-09---|---200.00---

3---------|---39---|---2014-02-20------|---2014-03-19---|---120.00---

4---------|---45---|---2014-01-15------|---2014-04-14---|---600.00---

Teraz muszę obliczyć, ile pieniędzy (względnie) każdy identyfikator utworzył tylko w lutym 2014 roku.

Pierwszy rząd jest łatwy, cała kwota jest w lutym 2014 roku.

W drugim rzędzie muszę obliczyć, że w styczniu jest 31 dni i 9/31 kwoty.

W trzecim rzędzie jest podobnie jak w drugim rzędzie, w lutym jest 28 dni, a więc 9/28 kwoty.

Czwarty rząd jest trudny, luty wcale się nie pokazuje i wiem, że między 15 stycznia a 14 kwietnia jest 90 dni, dlatego powinienem otrzymać 28/90 kwoty.

Wynik poszukiwany:

ROW-------|---ID---|---MONTH----|---SUM---

1---------|---10---|---02/2014---|---150.00---

2---------|---22---|---02/2014---|---58.06---

3---------|---39---|---02/2014---|---38.57---

4---------|---45---|---02/2014---|---186.66---

Proszę mi pomóc, jak to zrobić.

Dzięki!!!

Odpowiedzi:

1 dla odpowiedzi № 1

To trochę trudne.

Oto jedna metoda liczenia tylko pokrywających się dni w lutym (lub innym okresie):

select sum(datediff(least(to_date, date("2014-03-01")), greatest(from_date, "2014-02-01"))) as days
from table t
where to_date >= date("2014-02-01") and from_date < date("2014-03-01");

0 dla odpowiedzi nr 2

Wypróbuj to zapytanie:

SELECT ROW,ID,"02/2014" MONTH,
(PRICE * (CASE WHEN EN < 0 THEN 28 ELSE 28 - EN END -
CASE WHEN ST <= 0 THEN 0 ELSE 28 - ST END))/CNT SUM
FROM
(SELECT DATEDIFF(FROM_DATE,DATE("2014-02-01"))ST,
DATEDIFF(DATE("2014-03-01"),TO_DATE) - 1 EN,
DATEDIFF(TO_DATE,FROM_DATE) + 1 CNT,TABLE1.* FROM TABLE1)T1;

SQL Fiddle