Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Автор Тема: Есть ли спецы в вопросах SQL?  (Прочитано 15337 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Последние сообщения Последние сообщения

- 22.11.2024 07:35:51 AlexeywEf

Hello 20.11.2024 07:32:57 AlexeywEf

Hello 29.10.2024 09:11:29 AlexeywEf

Лодочный сплав 2024! 10-11 августа 10.07.2024 15:41:13 Танк

Новости администрации 05.01.2024 12:11:59 Evlampij

Готовим мотоцикл Т.О. 23.11.2023 15:36:30 valkas

Куда первым делом идти новичкам :) 23.11.2023 15:36:13 valkas

TOY RUN Елгавский детский дом 23.08.2023 12:41:30 Evlampij

Лодочный сплав 2023! 19-20 августа 21.08.2023 11:33:23 Танк

Манометр для синхронизации карбюраторов. 25.05.2023 13:03:29 L1

Перенесено: Warrior 25.01.2023 19:46:36 Evlampij

ПДД 25.01.2023 00:47:39 mmaris

6-7 августа - Лодочный сплав 2022 18.07.2022 22:16:07 Танк

Поздравления!!! 08.03.2022 13:13:28 Rob

Yamaha MT 07 (стартер) 28.11.2021 12:05:25 foks185

Скутер vs мотоцикл 25.11.2021 18:08:00 Romai

Allen 30.09.2021 13:26:23 Linka

Poker Run 2018 12.09.2021 09:17:16 Танк

Sportbike Racing Suits- Race Leathers | Moto Speeds LLC 10.09.2021 14:40:53 motospeeds1

wanderer 09.09.2021 23:51:01 mmaris

Продается Suzuki DR 650 SE SP 46 31.08.2021 13:26:05 Igorek

Не будем смотреть со стороны 30.08.2021 15:55:29 Танк

Нужна помощь 22.08.2021 22:44:23 mmaris

14-15 августа - Лодочный сплав 2021 16.08.2021 00:20:25 Танк

07.08.2021 Паланга, Литва 03.08.2021 13:20:42 Танк

Kostas

  • Форумчанин
  • ***
  • Оффлайн Оффлайн
  • Сообщений: 471

Есть ли спецы в вопросах SQL?
Записан

void

  • Форумчанин
  • ***
  • Оффлайн Оффлайн
  • Сообщений: 389
Есть ли спецы в вопросах SQL?
« Ответ #1 : 04.11.2016 14:01:05 »

А поконкретнее - какая субд, какая задача? В каждой субд свои нюансы
« Последнее редактирование: 04.11.2016 14:20:45 от void »
Записан

Kostas

  • Форумчанин
  • ***
  • Оффлайн Оффлайн
  • Сообщений: 471
Есть ли спецы в вопросах SQL?
« Ответ #2 : 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               


Есть идеи?
« Последнее редактирование: 04.11.2016 14:43:26 от Костян »
Записан

CTAPyXA

  • Administrator
  • Знаток
  • *****
  • Оффлайн Оффлайн
  • Пол: Мужской
  • Сообщений: 1583
Есть ли спецы в вопросах SQL?
« Ответ #3 : 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
Записан
Администрация мотофорума - Freeriders.lv

Kostas

  • Форумчанин
  • ***
  • Оффлайн Оффлайн
  • Сообщений: 471
Есть ли спецы в вопросах SQL?
« Ответ #4 : 04.11.2016 15:10:50 »

типа так?

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


Записан

void

  • Форумчанин
  • ***
  • Оффлайн Оффлайн
  • Сообщений: 389
Есть ли спецы в вопросах SQL?
« Ответ #5 : 04.11.2016 15:38:18 »

Как видно, она состоит из январской части аренды1, полной аренды 2 и январской части аренды3               
Аренда1 и аренда3 рассчитать по минутам, перемножить на кол-во минут в пересечении с периодом выборки + аренда2. Если я правильно понял задачу.
Записан

Kostas

  • Форумчанин
  • ***
  • Оффлайн Оффлайн
  • Сообщений: 471
Есть ли спецы в вопросах SQL?
« Ответ #6 : 04.11.2016 15:53:41 »

Аренда1 и аренда3 рассчитать по минутам, перемножить на кол-во минут в пересечении с периодом выборки + аренда2. Если я правильно понял задачу

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

 
Записан

Taiwaz

  • Кандидат в знатоки
  • *****
  • Оффлайн Оффлайн
  • Пол: Мужской
  • Сообщений: 1116
Есть ли спецы в вопросах SQL?
« Ответ #7 : 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
Записан

Kostas

  • Форумчанин
  • ***
  • Оффлайн Оффлайн
  • Сообщений: 471
Есть ли спецы в вопросах SQL?
« Ответ #8 : 04.11.2016 19:11:46 »

Спасибо. Буду разбираться
Записан

Taiwaz

  • Кандидат в знатоки
  • *****
  • Оффлайн Оффлайн
  • Пол: Мужской
  • Сообщений: 1116
Есть ли спецы в вопросах SQL?
« Ответ #9 : 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
Записан

Kostas

  • Форумчанин
  • ***
  • Оффлайн Оффлайн
  • Сообщений: 471
Есть ли спецы в вопросах SQL?
« Ответ #10 : 17.11.2016 14:11:02 »

Taiwaz,

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

Страница сгенерирована за 4.386 секунд. Запросов: 23.