Freeriders.lv

Мастерская => Помощь с компьютером => Тема начата: Kostas от 04.11.2016 13:50:51

Название: Есть ли спецы в вопросах SQL?
Отправлено: Kostas от 04.11.2016 13:50:51
Есть ли спецы в вопросах SQL?
Название: Есть ли спецы в вопросах SQL?
Отправлено: void от 04.11.2016 14:01:05
А поконкретнее - какая субд, какая задача? В каждой субд свои нюансы
Название: Есть ли спецы в вопросах SQL?
Отправлено: Kostas от 04.11.2016 14:41:47
Не могу составить корректный запрос в 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               


Есть идеи?
Название: Есть ли спецы в вопросах SQL?
Отправлено: CTAPyXA от 04.11.2016 14:53:28
типа так?

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
Название: Есть ли спецы в вопросах SQL?
Отправлено: Kostas от 04.11.2016 15:10:50
типа так?

дата начала и дата конца периода выборки - переменные


Название: Есть ли спецы в вопросах SQL?
Отправлено: void от 04.11.2016 15:38:18
Как видно, она состоит из январской части аренды1, полной аренды 2 и январской части аренды3               
Аренда1 и аренда3 рассчитать по минутам, перемножить на кол-во минут в пересечении с периодом выборки + аренда2. Если я правильно понял задачу.
Название: Есть ли спецы в вопросах SQL?
Отправлено: Kostas от 04.11.2016 15:53:41
Аренда1 и аренда3 рассчитать по минутам, перемножить на кол-во минут в пересечении с периодом выборки + аренда2. Если я правильно понял задачу

В excell примерно так и делаю.  А как сделать для MySQL или MS SQL , не знаю. 

 
Название: Есть ли спецы в вопросах SQL?
Отправлено: Taiwaz от 04.11.2016 16:32:53
перепроверь результат только, на коленке написано

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
Название: Есть ли спецы в вопросах SQL?
Отправлено: Kostas от 04.11.2016 19:11:46
Спасибо. Буду разбираться
Название: Есть ли спецы в вопросах SQL?
Отправлено: Taiwaz от 04.11.2016 19:28:35
Буду разбираться
будут вопросы - пиши в личку. тебе нужна только эта часть
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
Название: Есть ли спецы в вопросах SQL?
Отправлено: Kostas от 17.11.2016 14:11:02
Taiwaz,

Спасибо.  Работает правильно.  :beer: