Имя: Пароль:
1C
1С v8
v8: Туплю с разностью дат в запросе
,
0 Fragster
 
гуру
24.05.12
19:09
нужно получить разность даты полных месяцах, т.е.
разность между 20.01 и 20.02 = 1, а между 20.01 и 10.02 = 0. В запросе же РазностьДат(Д1,Д2, Месяц) возвращает разность между номерами месяцев (с учетом года, конечно), т.е. в обоих случаях 1.
Пока мысль со сравнением до кучи еще и разностей дат с началом месяцев в днях, но как-то это очень страшно.
1 Нуф-Нуф
 
24.05.12
19:11
уверен что разность номеров месяца?
2 Fragster
 
гуру
24.05.12
19:11
ага,


ВЫБРАТЬ
   ДАТАВРЕМЯ(2012, 3, 20) КАК Д1,
   ДАТАВРЕМЯ(2012, 4, 10) КАК Д2
ПОМЕСТИТЬ Данные
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Данные.Д1,
   Данные.Д2,
   РазностьДат(Д1,Д2, Месяц)
ИЗ
   Данные КАК Данные
3 Fragster
 
гуру
24.05.12
19:12
у меня выводит 1
4 Tatitutu
 
24.05.12
19:12
РАЗНОСТЬДАТ(<Выражение>, <Выражение>, Секунда | Минута | Час | День | Месяц | Квартал | Год)
5 Fragster
 
гуру
24.05.12
19:13
(4) ты не поверишь...


вот побольше данных для копипасты в первый запрос:
ВЫБРАТЬ
   ДАТАВРЕМЯ(2012, 3, 30) КАК Д1,
   ДАТАВРЕМЯ(2012, 4, 1) КАК Д2
ПОМЕСТИТЬ Данные
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
   ДАТАВРЕМЯ(2012, 4, 1) КАК Д1,
   ДАТАВРЕМЯ(2012, 4, 30) КАК Д2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
   ДАТАВРЕМЯ(2012, 3, 30) КАК Д1,
   ДАТАВРЕМЯ(2012, 5, 1) КАК Д2
;
6 Tatitutu
 
24.05.12
19:14
РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2012, 3, 20, 0, 0, 0), ДАТАВРЕМЯ(2012, 4, 10,0, 0, 0), МЕСЯЦ) // 1
7 Fragster
 
гуру
24.05.12
19:20
(6) ну так прочитай (0)
8 Нуф-Нуф
 
24.05.12
19:22
(3) точно

хм. ну накидай свою процедурку. хотя может и в типовых подобная уже есть
9 Fragster
 
гуру
24.05.12
19:22
(8) тут в запросе надо....

пока потестите такой вариант, может сделаете красивше:

ВЫБРАТЬ
   ДАТАВРЕМЯ(2012, 3, 30) КАК Д1,
   ДАТАВРЕМЯ(2012, 4, 1) КАК Д2
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ДАТАВРЕМЯ(2012, 4, 1),
   ДАТАВРЕМЯ(2012, 4, 30)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ДАТАВРЕМЯ(2012, 3, 30),
   ДАТАВРЕМЯ(2012, 5, 1)
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ДАТАВРЕМЯ(2012, 3, 10),
   ДАТАВРЕМЯ(2012, 4, 20)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Данные.Д1,
   Данные.Д2,
   РАЗНОСТЬДАТ(Данные.Д1, Данные.Д2, МЕСЯЦ) КАК РазностьДат,
   ВЫБОР
       КОГДА РАЗНОСТЬДАТ(Данные.Д1, Данные.Д2, МЕСЯЦ) > 0
               И ДОБАВИТЬКДАТЕ(Данные.Д1, МЕСЯЦ, РАЗНОСТЬДАТ(Данные.Д1, Данные.Д2, МЕСЯЦ)) > Данные.Д2
           ТОГДА 1
       ИНАЧЕ 0
   КОНЕЦ КАК Корректировка,
   РАЗНОСТЬДАТ(Данные.Д1, Данные.Д2, МЕСЯЦ) - ВЫБОР
       КОГДА РАЗНОСТЬДАТ(Данные.Д1, Данные.Д2, МЕСЯЦ) > 0
               И ДОБАВИТЬКДАТЕ(Данные.Д1, МЕСЯЦ, РАЗНОСТЬДАТ(Данные.Д1, Данные.Д2, МЕСЯЦ)) > Данные.Д2
           ТОГДА 1
       ИНАЧЕ 0
   КОНЕЦ КАК ПолныхМесяцев
ИЗ
   Данные КАК Данные
10 Нуф-Нуф
 
24.05.12
19:23
кстати:
28.01 - 28.02 - это полный месяц?  
31.01 - 28.02 - это полный месяц?  
30.03 - 30.04 - это полный месяц?  
31.03 - 30.04 - это полный месяц?
11 Fragster
 
гуру
24.05.12
19:25
(10) Да, геморрой. Ну условно "да" на все варианты
12 Fragster
 
гуру
24.05.12
19:27
токмо в этом году 29 февраля есть
13 Serg_1960
 
24.05.12
19:28
Сижу, репу чешу... Как автор собирается считать "в месяцах", если дни и те плавают из месяца в месяц.
14 Fragster
 
гуру
24.05.12
19:30
(13) допустим если искомый день в месяце отсутствует, то этот день переносится на предыдущий
15 Никола_
Питерский
 
24.05.12
19:53
А 20.01 - 20.05 это сколько у тебя полных месяцев ?
16 Fragster
 
гуру
24.05.12
19:55
(4) четыре, пока (9) работает
17 Fragster
 
гуру
24.05.12
19:58
пока других вариантов покрасивее нет?
18 Fragster
 
гуру
25.05.12
08:55
апапапа!
19 Ненавижу 1С
 
гуру
25.05.12
08:57
месяц это не точная единица измерения
20 Ненавижу 1С
 
гуру
25.05.12
08:59
с 29.01 по 28.02 это полный месяц или как?
с 30.05 по 30.06
с 31.08 по 30.09
21 Fragster
 
гуру
25.05.12
09:04
(19)(20) блин, как ты абонентку за инет платишь? если не с 1го по 1е, то с даты подключения какой-то не позднее такой же даты следующего месяца. если такой даты в следующем месяце нет - то в последний день того месяца.
22 Нуф-Нуф
 
25.05.12
13:43
(20) где-то я это уже видел
23 Нуф-Нуф
 
25.05.12
13:44
имхо нужно четкое определение полного месяца. и исходя из этого определения думать алгоритм вычисления
24 Ненавижу 1С
 
гуру
25.05.12
13:45
(21) вот это уже более менее постановка
25 Ненавижу 1С
 
гуру
25.05.12
13:45
(22) кабан!
26 Нуф-Нуф
 
25.05.12
13:46
(25) Мужик!
27 Ненавижу 1С
 
гуру
25.05.12
13:56
ВЫБРАТЬ
   РАЗНОСТЬДАТ(&Д1, &Д2, МЕСЯЦ) - ВЫБОР
       КОГДА ДЕНЬ(&Д1) > ДЕНЬ(&Д2)
           ТОГДА 1
       ИНАЧЕ 0
   КОНЕЦ КАК Месяцев
28 mkanaev
 
25.05.12
13:59
хммм....можно вычислить разность между месяцами, потом к первой дате добавить разность и определить разность в днях, причем если даты является последней датой в периоде МЕСЯЦ тогда результатом будет 0, если первая дата не конец месяца а вторая конец месяца тогда результат 1, если первая дата конец месяца а вторая нет тогда результат 0, к полученному количеству месяцев прибавить(отнять) один месяц если разность дней не равно 0.... это можно реализовать в запросе
29 Zenox
 
25.05.12
14:03
2012.01.31-2012.02.29 тогда получится 0
30 Ненавижу 1С
 
гуру
25.05.12
14:03
+(27)

ВЫБРАТЬ
   РАЗНОСТЬДАТ(&Д1, &Д2, МЕСЯЦ) - ВЫБОР
       КОГДА ДЕНЬ(&Д2) = ДЕНЬ(КОНЕЦПЕРИОДА(&Д2, МЕСЯЦ))
           ТОГДА 0
       КОГДА ДЕНЬ(&Д1) > ДЕНЬ(&Д2)
           ТОГДА 1
       ИНАЧЕ 0
   КОНЕЦ КАК Месяцев
31 mkanaev
 
25.05.12
14:06
(29) почему разность месяцев будет 1, разность дней будет 0
32 Zenox
 
25.05.12
14:11
31>29 имхо
33 mkanaev
 
25.05.12
14:13
(32) в ЭТОМ СЛУЧАЕ БУДЕТ НОЛЬ, т.к. и там и там конец месяца
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс