|
как в запросе грамотно посчитать дни | ☑ | ||
---|---|---|---|---|
0
Segate
29.05.14
✎
13:01
|
надо посчитать колличество дней
Есть датаНачалаДействия Есть датаКонцаДействия соответственно количество дней можно посчитать как РазностьДат(начало, конец, день). Но в таком случае если дата начала совпадает с датой конца, функция выдаст 0, а надо 1н. Но и это еще не все, если в один день есть несколько записей, то надо, чтобы они все равно группировались в 1н день. т.е. при исходных данных Дата начала Дата конца 01.01.01 00.00 01.01.01 01.00 01.01.01 02.00 01.01.01 14.00 01.01.01 22.00 02.01.01 01.00 04.02.01 00.00 04.02.01 11.00 запрос должен выдавать 3 дня. |
|||
1
Cube
29.05.14
✎
13:04
|
(0) Алгоритм:
1). Налить чай. 2). Сгруппировать записи. Найти максимум и минимум. 3). Откусить булочку. 4). Сделать РазностьДат. 5). Хлебнуть чая... |
|||
2
Рэйв
29.05.14
✎
13:05
|
(0)Приведи все даты к началу дня через НАЧАЛОПЕРИОДА и сгруппируй
|
|||
3
Segate
29.05.14
✎
13:05
|
(2) о, должно сработать.
|
|||
4
Cube
29.05.14
✎
13:07
|
(2) А смысл? Лишнее действие...
|
|||
5
agorbunov
29.05.14
✎
13:07
|
Приведи дату начала - к началу дня, дату конца - к концу дня.
Выбери различные. Чтобы в течение одного дня был 1 день, используй ВЫРАЗИТЬ(разностьдат(ДатаНачал, ДатаКонца, ЧАС)/24 КАК ЧИСЛО(10,0)) |
|||
6
Cube
29.05.14
✎
13:07
|
(3) Ты чай налил?
|
|||
7
Cube
29.05.14
✎
13:08
|
(5) Бугагашеньки)))))
|
|||
8
agorbunov
29.05.14
✎
13:10
|
(7) Да, косяк. Так на двух соседних датах выдаст 2.
|
|||
9
fisher
29.05.14
✎
13:12
|
Задача не такая тривиальная, как кажется. Правильного решения пока не увидел.
|
|||
10
Серго62
29.05.14
✎
13:13
|
(1) Пятнично :)
|
|||
11
Серго62
29.05.14
✎
13:14
|
(9) Давай свой вариант
|
|||
12
fisher
29.05.14
✎
13:17
|
(11) Он будет не настолько простой, чтобы мне не было лень этим заниматься. Суть в том, что нужно получить таблицу всех дат ВНУТРИ ВСЕХ ДИАПАЗОНОВ и сгруппировать.
|
|||
13
Серго62
29.05.14
✎
13:17
|
(0) РазностьДат+1 не оно?
|
|||
14
Cube
29.05.14
✎
13:18
|
(0) А, так тебе не разность дат, а количество дат надо?))
|
|||
15
tdm
29.05.14
✎
13:23
|
(12) а разве началоПериода(,,день) и группировка с получение кол-ва различных не сработает ? как в (2) и написано
|
|||
16
Cube
29.05.14
✎
13:30
|
+(14) Хлебнул чая:
ВЫБРАТЬ ДАТАВРЕМЯ(2001, 1, 1, 0, 0, 0) КАК ДатаНачала, ДАТАВРЕМЯ(2001, 1, 1, 1, 0, 0) КАК ДатаКонца ПОМЕСТИТЬ Данные ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2001, 1, 1, 2, 0, 0), ДАТАВРЕМЯ(2001, 1, 1, 14, 0, 0) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2001, 1, 1, 22, 0, 0), ДАТАВРЕМЯ(2001, 1, 2, 1, 0, 0) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2001, 2, 4, 0, 0, 0), ДАТАВРЕМЯ(2001, 2, 4, 11, 0, 0) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДОБАВИТЬКДАТЕ(ДиапазонДанных.ДатаНачала, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Дата ПОМЕСТИТЬ Календарь ИЗ (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК aa ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК b ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК bb ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК c ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК cc ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК d ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК dd ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВложенныйЗапрос.ДатаНачала КАК ДатаНачала, ВложенныйЗапрос.ДатаКонца КАК ДатаКонца, РАЗНОСТЬДАТ(ВложенныйЗапрос.ДатаНачала, ВложенныйЗапрос.ДатаКонца, ДЕНЬ) КАК КоличествоДней ИЗ (ВЫБРАТЬ МИНИМУМ(Данные.ДатаНачала) КАК ДатаНачала, МАКСИМУМ(Данные.ДатаКонца) КАК ДатаКонца ИЗ Данные КАК Данные) КАК ВложенныйЗапрос) КАК ДиапазонДанных ПО (ИСТИНА) ГДЕ aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= ДиапазонДанных.КоличествоДней ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Календарь.Дата) КАК Дата ИЗ Календарь КАК Календарь ВНУТРЕННЕЕ СОЕДИНЕНИЕ Данные КАК Данные ПО Календарь.Дата >= Данные.ДатаНачала И Календарь.Дата <= Данные.ДатаКонца |
|||
17
fisher
29.05.14
✎
13:31
|
(15) Нет. Нужно посчитать количество дней ВНУТРИ диапазонов, без учета ПЕРЕСЕЧЕНИЙ диапазонов. Если я правильно понял условие.
|
|||
18
fisher
29.05.14
✎
13:32
|
(16) Во. Похоже на правду.
|
|||
19
DS
29.05.14
✎
13:58
|
(15) Все так, только не количество различных, а максимум.
|
|||
20
Segate
29.05.14
✎
14:00
|
(17)да, именно так.
(16) похоже на правду, но уж очень хочется более изящного решения... не люблю я такое в запросах ) |
|||
21
Segate
29.05.14
✎
14:01
|
(14) смотри (17) фишер умеет костноязычных понимать и нормально интерпритировать )))
|
|||
22
fisher
29.05.14
✎
14:08
|
(20) Изящнее не получится. Календарь по-любому нужен. Можно разве что компактнее и красивее оформить через промежуточную временную таблицу. Или использовать готовую таблицу календаря, если такая есть в конфигурации.
|
|||
23
Segate
29.05.14
✎
14:10
|
Окей... спасибо всем, буду делать через календарь.
|
|||
24
DS
29.05.14
✎
14:12
|
(20) Если есть вложенные интервалы, изящнее (16) сделать сложно. Если нет - (19).
|
|||
25
DS
29.05.14
✎
14:12
|
*вложенные и пересекающиеся
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |