Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 10
1

Подсчитать количество дней, которое машина простояла в определенном месяце

27.11.2012, 18:09. Показов 5096. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Начнем сначала . Опыт работы в МС Аксес у меня довольно скуден, и, как любой новичок, взялся за проектирование, надеясь не встретить на своем пути подводных камней, которые появились именно в том месте, где их меньше всего ожидалось.
Суть проблемы - есть база данных стоянки автомобилей, в ней, кроме всего прочего указаны дата приезда и дата отъезда . Нужно подсчитать количество дней, которое машина простояла именно в этом месяце . То-есть, если она стояла с середины прошлого месяца до середины этого, в отдельных отчетах по месяцам должно выдать ~ по 15 дней .
Буду крайне благодарен за помощь )
Вложения
Тип файла: rar База стоянки авто.rar (107.6 Кб, 31 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2012, 18:09
Ответы с готовыми решениями:

Определить полугодие, на которое приходится месяц с номером m и количество дней в том месяце
Написать программу на С#: 8.Дано число m (1 m  12). Определить полугодие, на которое...

Множества.Месяц 1..30 Описать функцию число дней (m), определяющую количество дней в месяце (n) не високосного года.
Месяц 1..30 Описать функцию число дней (m), определяющую количество дней в месяце (n) не...

Количество дней в месяце
Как узнать сколько дней в текущем месяце ? Такой расчет используется в выражении: Количество...

Количество дней в месяце
Таск 1 Пользователь вводит номер месяца . Надо вывести количество дней в этом месяце ...

31
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 10
27.11.2012, 18:16  [ТС] 2
количество дней, при этом всем подсчитывается корректно (то-есть [дата отъезда] - [дата приезда]) .
как вариант, думал рассмотреть следующим образом - создать отдельную таблицу, в которую макрос будет добавлять значение сегодняшней даты в отдельном поле, если машина не уехала (соответствующая галочка не проставлена) - а потом сделать подсчет по отфильтрованным данным, - количество записей, которые соответствуют определенному месяцу .
Или создать отдельный запрос, в котором по условию будет меняться дата на первое число данного месяца, если она попадает на предыдущий месяц .
Идеи решения проблемы есть, но вот с реализацией туговато, т.к. .
0
Эксперт MS Access
26815 / 14494 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
27.11.2012, 18:53 3
Цитата Сообщение от Liberty_One Посмотреть сообщение
Суть проблемы - есть база данных стоянки автомобилей, в ней, кроме всего прочего указаны дата приезда и дата отъезда . Нужно подсчитать количество дней, которое машина простояла именно в этом месяце . То-есть, если она стояла с середины прошлого месяца до середины этого, в отдельных отчетах по месяцам должно выдать ~ по 15 дней .
Попробуйте запрос
SQL
1
2
3
SELECT КодАвтомобиля, Модель, ДатаПриезда, ДатаОтъезда, 
iif(format(ДатаПриезда, "yyyymm")<>format(ДатаОтъезда, "yyyymm"), DAY(ДатаОтъезда), ДатаОтъезда-ДатаПриезда) AS Kolday
FROM Автомобили
2
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
27.11.2012, 20:37 4
Liberty_One, посмотрите такой вариант
SQL
1
2
3
4
5
6
7
8
SELECT КодАвтомобиля, 
       SUM(IIf(em<Nz(ДатаОтъезда,DATE()), em, Nz(ДатаОтъезда,DATE()))-
           IIf(bm>ДатаПриезда, bm, ДатаПриезда)+1) AS КолДней
FROM Tab,
     (SELECT Top 1 DateSerial(Год, Месяц, 1) AS bm, DateSerial(Год, Месяц+1,0) AS em 
      FROM MSysObjects) AS Q
WHERE em>=ДатаПриезда AND Nz(ДатаОтъезда,DATE())>=bm
GROUP BY КодАвтомобиля
Здесь Год, Месяц - параметры, значения года и месяца, на которые выполняется расчет
Если машина на момент расчета не уехала, то предполагается, что поле ДатаОтъезда исходной таблицы Tab не заполнено (имеет значение Null) и в качестве даты отъезда берется текущая дата.
1
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 10
28.11.2012, 12:15  [ТС] 5
mobile, minob
Ребята, премного благодарен !
не знаю, что бы я без вас делал )
0
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 10
02.12.2012, 02:06  [ТС] 6
возможно нарушу правила, но есть еще один вопрос по той же базе .
Добавилась таблица "Стояли в боксе" - дата, когда поставили в бокс, дата когда из бокса убрали. Связана по коду с основной таблицей . Нужно подсчитать, сколько дней в сумме простояла машина в боксе, и отнять это число от количества всех дней в месяце . В боксе одна и та же машина может стоять несколько раз за весь период простоя .
Буду благодарен за помощь )
Вложения
Тип файла: rar База стоянки авто1.rar (78.8 Кб, 24 просмотров)
0
Эксперт MS Access
26815 / 14494 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
02.12.2012, 04:34 7
Если одно стояние в боксе не переходит из месяца в месяц, т.е. нет такого, чтобы поставили в одном месяце, а забрали в другом, то пригоден простой запрос на сумму разностей дат
T-SQL
1
2
3
4
5
select КодАвтомобиля,  year(Поставили) as Год, month(Поставили) as Месяц,
     sum(Забрали-Поставили)+1 as [Стояла в боксе], 
     day(dateserial(Year(Поставили), month(Поставили)+1,0))-[Стояла в боксе] as [Не стояла в боксе]
from СтоялиВБоксе
group by КодАвтомобиля, year(Поставили), month(Поставили)
1
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
02.12.2012, 08:23 8
Цитата Сообщение от Liberty_One Посмотреть сообщение
Добавилась таблица "Стояли в боксе" - дата, когда поставили в бокс, дата когда из бокса убрали. Связана по коду с основной таблицей . Нужно подсчитать, сколько дней в сумме простояла машина в боксе, и отнять это число от количества всех дней в месяце . В боксе одна и та же машина может стоять несколько раз за весь период простоя .
Буду благодарен за помощь )
Liberty_One, вижу в моем варианте запроса вы не разобрались (да и, как мне кажется, свою задачу не до конца прочувствовали), т.к. в ином случае такого бы вопроса не было. Заменив в запросе ДатаПриезда, ДатаОтъезда, КолДней, Tab, соответственно на Поставили, Забрали, КолДнейВБоксе, СтоялиВБоксе, получите решение вашей задачи, в котором, кстати, учитываются случаи, когда машину ставят в одном месяце, а забирают в другом.
Чтобы найти разность количества дней месяца и количества дней простоя добавьте в SELECT поле
SQL
1
DAY(FIRST(em))-КолДнейВБоксе AS ХЗ_как_его_назвать
В выложенной базе посмотрел таблицу СтоялиВБоксе, где в единственной записи такие значения полей: Поставили - 18.11.2012, Забрали - 19.11.2012, КолДнейВБоксе - 1. Т.е вы считаете дни, когда поставили и когда забрали, за один день? А если машину ставят и забирают в один и тот же день, то получается, что в боксе она и вовсе не стояла? Если это так, то уберите из поля расчета количества дней +1, не перепутайте с Месяц+1
1
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 10
02.12.2012, 12:37  [ТС] 9
Цитата Сообщение от minob Посмотреть сообщение
Т.е вы считаете дни, когда поставили и когда забрали, за один день? А если машину ставят и забирают в один и тот же день, то получается, что в боксе она и вовсе не стояла?
дело в том, что оплата идет за ночь стоянки . Если в тот же день ее забрали из бокса - значит она там, по сути, и вовсе не стояла )

Цитата Сообщение от minob Посмотреть сообщение
вижу в моем варианте запроса вы не разобрались (да и, как мне кажется, свою задачу не до конца прочувствовали)
честно говоря, вы полностью правы )
Дело в том, что машины, стоявшие в боксе не оплачиваются, поэтому нужно, чтобы количество всех дней, которые конкретная машина простояла в боксе было исключено из общего количества дней в месяце .

Цитата Сообщение от minob Посмотреть сообщение
Если это так, то уберите из поля расчета количества дней +1
Действительно, сразу не обратил на это внимания . Спасибо )
0
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
02.12.2012, 13:23 10
Цитата Сообщение от Liberty_One Посмотреть сообщение
... машины, стоявшие в боксе не оплачиваются, поэтому нужно, чтобы количество всех дней, которые конкретная машина простояла в боксе было исключено из общего количества дней в месяце.
Не понял.
Возможно, вы хотели сказать: машины, стоявшие в боксе не оплачиваются, поэтому нужно, чтобы количество всех дней, которые конкретная машина простояла в боксе было исключено из общего количества дней, которые машина числилась на стоянке?
1
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 10
02.12.2012, 13:43  [ТС] 11
Цитата Сообщение от minob Посмотреть сообщение
из общего количества дней, которые машина числилась на стоянке?
Именно так )
0
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
02.12.2012, 14:17 12
Цитата Сообщение от Liberty_One Посмотреть сообщение
Именно так )
Тогда по моему запросу разность вы получите неверно, т.к. я буквально воспринял ваше
Цитата Сообщение от Liberty_One Посмотреть сообщение
количества всех дней в месяце
а не как "количества всех дней стоянки в месяце"
Но это все поправимо.

Следовательно задача такая:
В заданном месяце для каждого автомобиля определяем:
а) количество дней (ds) стоянки (кстати по формуле с +1 или без?);
б) количество дней (db), проведенное в боксе;
в) количество оплачиваемых дней (ds-db).

Продумайте, как расчитываются дни в п. а) и б), так как иогут возникнуть непонятки.
Например, автомобиль поставили в бокс 30.11.2012, а забрали 01.12.2012. Если считать без разбивки по месяцам, то он находился в боксе 1 день. Если же считать с разбивкой по месяцам, то в ноябре он находился в боксе с 30.11.2012 по 30.11.2012, т.е. 0 дней, в декабре с 01.12.2012 по 01.12.2012, тоже 0 дней. В конечном итоге, оплачивающий стоянку может возмутиться.

Перестраховочный вопрос: интервал времени нахождения в боксе принадлежит интервалу времени стоянки?
0
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 10
02.12.2012, 16:38  [ТС] 13
Цитата Сообщение от minob Посмотреть сообщение
из общего количества дней, которые машина числилась на стоянке?
да, именно так . Проблема в создании запроса с двух таблиц, по сути (
0
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
02.12.2012, 18:35 14
Liberty_One, вы не ответили на вопросы:
а)
Цитата Сообщение от minob Посмотреть сообщение
а) количество дней (ds) стоянки (кстати по формуле с +1 или без?);
Т.е. к разности дат (ДатаОтъезда-ДатаПриезда) нужно добавлять 1 или нет?
б)
Цитата Сообщение от minob
Перестраховочный вопрос: интервал времени нахождения в боксе принадлежит интервалу времени стоянки?
Никак не прокомментировали и не прояснили
Цитата Сообщение от minob Посмотреть сообщение
Продумайте, как расчитываются дни в п. а) и б), так как иогут возникнуть непонятки.
Например, автомобиль поставили в бокс 30.11.2012, а забрали 01.12.2012. Если считать без разбивки по месяцам, то он находился в боксе 1 день. Если же считать с разбивкой по месяцам, то в ноябре он находился в боксе с 30.11.2012 по 30.11.2012, т.е. 0 дней, в декабре с 01.12.2012 по 01.12.2012, тоже 0 дней. В конечном итоге, оплачивающий стоянку может возмутиться.
Добавлено через 1 час 3 минуты
Liberty_One, извините, я понял, вам позарез нужен хоть какой-нибудь запрос, а тут я со своими вопросами.
Вот запрос. Надеюсь проблемы, которые возникнут при его эксплуатации, вам удастся решить самостоятельно.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT S.КодАвтомобиля, S.КолДнейСтоянки, B.КолДнейВБоксе, 
       S.КолДнейСтоянки-B.КолДнейВБоксе AS КолДнейОплаты
FROM
     (SELECT КодАвтомобиля,
            SUM(IIf(em<Nz(ДатаОтъезда,DATE()), em, Nz(ДатаОтъезда,DATE()))-
                IIf(bm>ДатаПриезда, bm, ДатаПриезда)) AS КолДнейСтоянки
     FROM Автомобили,
         (SELECT Top 1 DateSerial(Год, Месяц, 1) AS bm, DateSerial(Год, Месяц+1,0) AS em 
          FROM MSysObjects) AS Q
     WHERE em>=ДатаПриезда AND Nz(ДатаОтъезда,DATE())>=bm
     GROUP BY КодАвтомобиля) AS S
LEFT JOIN 
     (SELECT КодАвтомобиля, 
            SUM(IIf(em<Nz(Забрали,DATE()),em,Nz(Забрали,DATE()))-
                IIf(bm>Поставили,bm,Поставили)) AS КолДнейВБоксе
     FROM СтоялиВБоксе,
         (SELECT Top 1 DateSerial(Год, Месяц, 1) AS bm, DateSerial(Год, Месяц+1,0) AS em 
           FROM MSysObjects) AS Q
     WHERE em>=Поставили AND Nz(Забрали,DATE())>=bm
     GROUP BY КодАвтомобиля) AS B
ON S.КодАвтомобиля=B.КодАвтомобиля
1
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 10
03.12.2012, 00:07  [ТС] 15
minob,
а) добавлять к разности +1 не нужно, успешно убрал )
б) интервал нахождения в боксе принадлежит интервалу времени стоянки
в) интересный момент, не обратил сразу на него внимания . Наверное, следует определять количество дней проведенных в боксе без разбивки по месяцам . Кстати, скорее возмутится хозяин стоянки, когда ему денег не заплатят )
п.с. прошу прощения за задержку с ответом, я вам искренне признателен за уделенное для меня время и старания разобраться в моей проблеме )
п.п.с. Можно ли как-то забить поля "КолДнейОплаты" значениями из "КолДнейСтоянки" ? Даже для тех, которые в боксе не стояли ?
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 7
17.12.2012, 20:03 16
Извините, что влезаю в Вашу тему. Но у меня тоже проблемы с вычислением разницы в датах. Но у меня проблема в том что даты у меня записаны в одном столбце и нужно вычислить разницу дат n-строчки с n+1 строчки. Массив строк очень велик и привязаться к какому то значению даты нельзя и перевернуть, так что бы даты были в столбцах, массив нельзя. Подскажите как выйти из этой ситуации.
0
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
17.12.2012, 21:43 17
Цитата Сообщение от iris_vz Посмотреть сообщение
Но у меня проблема в том что даты у меня записаны в одном столбце и нужно вычислить разницу дат n-строчки с n+1 строчки
В предположении, что поле с датой уникально и сортировка по полю с датой по убыванию даст требуемый в ТЗ порядок следования записей, можно воспользоваться таким запросом
SQL
1
2
3
4
5
SELECT Tabl.*,
       DMax("Поле_с_датой","Tabl","Поле_с_датой < " & Format(Поле_с_датой,"\#mm\/dd\/yyyy\#")) AS Следующая_дата,
       DateDiff("d", Следующая_дата, Поле_с_датой) AS Разность_дат
FROM Tabl
ORDER BY Поле_с_датой DESC
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 7
18.12.2012, 16:34 18
Цитата Сообщение от minob Посмотреть сообщение
В предположении, что поле с датой уникально и сортировка по полю с датой по убыванию даст требуемый в ТЗ порядок следования записей, можно воспользоваться таким запросом
SQL
1
2
3
4
5
SELECT Tabl.*,
       DMax("Поле_с_датой","Tabl","Поле_с_датой < " & Format(Поле_с_датой,"\#mm\/dd\/yyyy\#")) AS Следующая_дата,
       DateDiff("d", Следующая_дата, Поле_с_датой) AS Разность_дат
FROM Tabl
ORDER BY Поле_с_датой DESC
Спасибо за ответ, но мне слегка не подходит. Мне нужно именно сравнение n строчки со следующей. Упорядочить в большую или меньшую сторону нельзя.
0
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
18.12.2012, 17:50 19
Цитата Сообщение от iris_vz Посмотреть сообщение
Спасибо за ответ, но мне слегка не подходит. Мне нужно именно сравнение n строчки со следующей. Упорядочить в большую или меньшую сторону нельзя.
Таблица - куча записей. Поэтому для того, чтобы сказать, что некоторая запись предшествует другой, необходимо записи упорядочить, что достигается сортировкой записей ORDER BY.
Поэтому возникает вопрос, есть ли у вас в таблице уникальное поле, например, первичный ключ, или несколько полей дающих в совокупности уникальность, отсортировав по которым получим требуемую последовательность? Если таковых нет, то с помощью запроса (ИМХО) нельзя определить какая запись следует за другой или предшествует другой. В таком случае, полагаясь на удачу, можно в VBA открыть рекордсет, источником данных, которого будет таблица, и проходя по его записям определять разность. Но нет никакой гарантии, что записи будут следовать в нужном порядке.

Судя по вашему ответу можно сделать вывод, что разность дат у вас может быть, как положительная, так и отрицательная, а может и 0. Так ли это?

Наверное под упорядочиванием в большую сторону вы имели ввиду упорядочивание по возрастанию, а в меньшую - по убыванию?

А вообще-то, чтобы не гадать на кофейной гуще, выложили бы базу с фрагментом своей таблицы.
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 7
18.12.2012, 19:01 20
Цитата Сообщение от minob Посмотреть сообщение
Таблица - куча записей. Поэтому для того, чтобы сказать, что некоторая запись предшествует другой, необходимо записи упорядочить, что достигается сортировкой записей ORDER BY.
Поэтому возникает вопрос, есть ли у вас в таблице уникальное поле, например, первичный ключ, или несколько полей дающих в совокупности уникальность, отсортировав по которым получим требуемую последовательность? Если таковых нет, то с помощью запроса (ИМХО) нельзя определить какая запись следует за другой или предшествует другой. В таком случае, полагаясь на удачу, можно в VBA открыть рекордсет, источником данных, которого будет таблица, и проходя по его записям определять разность. Но нет никакой гарантии, что записи будут следовать в нужном порядке.

Судя по вашему ответу можно сделать вывод, что разность дат у вас может быть, как положительная, так и отрицательная, а может и 0. Так ли это?

Наверное под упорядочиванием в большую сторону вы имели ввиду упорядочивание по возрастанию, а в меньшую - по убыванию?

А вообще-то, чтобы не гадать на кофейной гуще, выложили бы базу с фрагментом своей таблицы.
В таблице несколько полей, самые главные 2:
рег.номер дата
а 21.01.12
а 29.03.12
а 11.04.12
а 09.05.12
а 21.11.12
в 01.01.11
в 21.01.11
в 23.08.12
в 06.09.12
в 08.11.12
Мне нужно что бы со значением одного рег.номера подсчитать разницу в датах (друг с другом, а последнюю с текущей). Даты по одному рег.номеру упорядочены по возрастанию. Но значений "рег.номеров" у меня много и так же к каждому большой перечень дат. Извините за не профессиональный язык и спасибо что тратите свое время.
0
18.12.2012, 19:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2012, 19:01
Помогаю со студенческими работами здесь

Количество дней в месяце
Есть программа, но работает она не очень точно, суть в том, что она должна отсчитать ровно год...

Количество дней в месяце
Вывести количество дней в текущем месяце можно так: perl -MTime::Piece -E '$t=localtime;say...

Определить количество строк в компоненте ListBox и количество дней в выбранном месяце
Вынесите на форму компонент ListBox и занесите туда названия 12 месяцев года. Напишите программу:...

Определить количество дней в месяце
На проверочном сайте проходит 70%, где ошибка? Вывести количество дней в N–том месяце M–го года...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru