Freeriders.lv
Мастерская => Помощь с компьютером => Тема начата: Kostas от 04.11.2016 13:50:51
-
Есть ли спецы в вопросах SQL?
-
А поконкретнее - какая субд, какая задача? В каждой субд свои нюансы
-
Не могу составить корректный запрос в MySQL на выборку суммы значений между датами.
Типа, есть исходные данные
начало конец полученная аренда
аренда1 25/12/2014 13:30 03/01/2015 18:00 5200
аренда2 03/01/2015 18:00 26/01/2015 12:20 17340
аренда3 26/01/2015 12:20 07/02/2015 00:35 4700
......
.......
........
аренда48 24/12/2015 14:45 04/01/2016 13:00 6500
Необходимо выбрать сумму полученной аренды за произвольный период, скажем с 01/01/2016 00:00 по 31/01/2016 23:59
Как видно, она состоит из январской части аренды1, полной аренды 2 и январской части аренды3
Есть идеи?
-
типа так?
SELECT SUM(полученная аренда)
WHERE начало BETWEN 01/01/2016 00:00 AND 31/01/2016 23:59
AND конец BETWEN 01/01/2016 00:00 AND 31/01/2016 23:59
-
типа так?
дата начала и дата конца периода выборки - переменные
-
Как видно, она состоит из январской части аренды1, полной аренды 2 и январской части аренды3
Аренда1 и аренда3 рассчитать по минутам, перемножить на кол-во минут в пересечении с периодом выборки + аренда2. Если я правильно понял задачу.
-
Аренда1 и аренда3 рассчитать по минутам, перемножить на кол-во минут в пересечении с периодом выборки + аренда2. Если я правильно понял задачу
В excell примерно так и делаю. А как сделать для MySQL или MS SQL , не знаю.
-
перепроверь результат только, на коленке написано
declare @rent table(
id int,
rentBegin datetime,
rentEnd datetime,
total decimal(15,2)
)
insert into @rent (id, rentBegin, rentEnd, total) values (1, '2014-12-25 13:30', '2015-01-03 18:00', 5200)
insert into @rent (id, rentBegin, rentEnd, total) values (2, '2015-01-03 18:00', '2015-01-26 12:20', 17340)
insert into @rent (id, rentBegin, rentEnd, total) values (3, '2015-01-26 12:20', '2015-02-07 00:35', 4700)
insert into @rent (id, rentBegin, rentEnd, total) values (4, '2015-12-24 14:45', '2016-01-04 13:00', 6500)
Declare @begin datetime,
@end datetime
Set @begin = '2015-01-01 00:00'
Set @end = '2015-01-31 23:59'
select cast(sum(tariff * perionTime) as decimal(15,2)) from
(
select id, DATEdiff(ss, rentBegin, rentEnd) as fullrentTime,
case
when (rentBegin < @begin and rentEnd > @end) then DATEdiff(ss, @begin, @end)
when (rentBegin >= @begin and rentEnd <= @end) then DATEdiff(ss, rentBegin, rentEnd)
when (rentBegin < @begin and rentEnd <= @end) then DATEdiff(ss, @begin, rentEnd)
when (rentBegin >= @begin and rentEnd > @end) then DATEdiff(ss, rentBegin, @end)
end as perionTime
, total, total / DATEdiff(ss, rentBegin, rentEnd) as tariff from @rent
where rentBegin between @begin and @end or rentEnd between @begin and @end
) as r
-
Спасибо. Буду разбираться
-
Буду разбираться
будут вопросы - пиши в личку. тебе нужна только эта часть
Declare @begin datetime,
@end datetime
Set @begin = '2015-01-01 00:00'
Set @end = '2015-01-31 23:59'
select cast(sum(tariff * perionTime) as decimal(15,2)) from
(
select id, DATEdiff(ss, rentBegin, rentEnd) as fullrentTime,
case
when (rentBegin < @begin and rentEnd > @end) then DATEdiff(ss, @begin, @end)
when (rentBegin >= @begin and rentEnd <= @end) then DATEdiff(ss, rentBegin, rentEnd)
when (rentBegin < @begin and rentEnd <= @end) then DATEdiff(ss, @begin, rentEnd)
when (rentBegin >= @begin and rentEnd > @end) then DATEdiff(ss, rentBegin, @end)
end as perionTime
, total, total / DATEdiff(ss, rentBegin, rentEnd) as tariff from @rent
where rentBegin between @begin and @end or rentEnd between @begin and @end
) as r
@rent - таблица в твоей базе
id - аренда1.. аренда48
rentBegin - [начало]
rentEnd - [конец]
total - [полученная аренда]
Set @begin = '2015-01-01 00:00' - начало твоего периода
Set @end = '2015-01-31 23:59' - конец периода.
тариф расчитан по секундам, если хочешь поменять на минуты или дни, то нужно менять значение 1го параметав DATEdiff, вместо ss - mm, dd и так далее
этот пример на MS SQL
-
Taiwaz,
Спасибо. Работает правильно. :beer: