Имя: Пароль:
1C
1С v8
как можно получить разность 2х дат?
0 LivingStar
 
07.02.12
08:05
есть 2 даты:

Формат(Рез.ДатаЗаказа, "ДФ=dd.MM.yyyy")
Формат(Рез.ДатаППВход, "ДФ=dd.MM.yyyy")

как между ними получить разность в днях?

Формат(Рез.ДатаЗаказа, "ДФ=dd.MM.yyyy") - Формат(Рез.ДатаППВход, "ДФ=dd.MM.yyyy") = ?
1 ZanderZ
 
07.02.12
08:06
(Дата1 - Дата2) /86400
2 napagokc
 
07.02.12
08:09
тут уже стописяттыщраз этот вопрос обмусоливался так-то
3 vde69
 
07.02.12
08:11
запросом и там РазностьДат()
4 DrShad
 
07.02.12
08:11
если прямо в запросе то ты не поверишь РазностьДат()
5 DrShad
 
07.02.12
08:12
ТС уже почти 7 лет на форуме, а до сих пор ни справку ни СП не осилил :)
6 D_Pavel
 
07.02.12
08:13
Функция РазностьДат(Дата1,Дата2,вхТип="День") Экспорт
   Запрос=Новый Запрос("
   | SELECT РазностьДат(&Дата1,&Дата2,"+вхТип+") AS ВозвращаемаяДата
   |");
   Запрос.УстановитьПараметр("Дата1",Дата1);
   Запрос.УстановитьПараметр("Дата2",Дата2);
   Выб=Запрос.Выполнить().Выбрать();
   Выб.Следующий();
   Возврат -Выб.ВозвращаемаяДата;
КонецФункции    
7 LivingStar
 
07.02.12
08:13
(1) спасибо!
8 LivingStar
 
07.02.12
08:14
(6) спасибо!
9 Luhtas
 
07.02.12
08:14
(6) ООо-оо! Супер способ!
10 D_Pavel
 
07.02.12
08:15
всегда рад помочь
11 SeraFim
 
07.02.12
08:15
(6) мсье знает толк в извращениях...
12 D_Pavel
 
07.02.12
08:18
(11) Ты щас хрень написал, показывая свою глупость. Потому что это не извращение, а способ который используют опытные одинесники.
13 ZanderZ
 
07.02.12
08:20
(12) видимо сильно опытные раз для того что бы узнать разность дать поднимают объект запрос и подтягивают сервер - особенно в тонком клиенте актуально...
14 DrShad
 
07.02.12
08:20
(12) а я то и не знал!
15 DrShad
 
07.02.12
08:21
(12) чем то что в (6) лучше чем то что в (1)
16 D_Pavel
 
07.02.12
08:22
(13) И в чем твоя проблема? У меня всё работает.
17 ZanderZ
 
07.02.12
08:22
(16) молодец!
18 Повелитель
 
07.02.12
08:23
(12)
У вас в конторе платят за результат или за количество исходного текста? Это бы многое объяснило ))
19 andrewks
 
07.02.12
08:23
эй, хватит спорить, горячие финские парни!
20 D_Pavel
 
07.02.12
08:24
(15) Это вопрос? Ничем не лучше, кроме того что в (1) возвращает не целое число. Можно использовать любой вариант, какой больше нравится. Я, например, (1) очень часто использую.
21 DrShad
 
07.02.12
08:25
(16) можно и на 1000 строк расписать и тоже будет работать
22 D_Pavel
 
07.02.12
08:25
(18) Текста там где нужно получается не так уж и много:

Результат = РазностьДат(Дата1,Дата2);
23 DrShad
 
07.02.12
08:26
(22) тебе в (13) уже расписали что при этом происходит
24 Повелитель
 
07.02.12
08:26
(22) Не ну красивый метод, я не спорю, просто необычный
25 D_Pavel
 
07.02.12
08:27
(18) благо сейчас терабайтные винчестеры позволяют записать несколько лишних байт без заметного вреда.
26 D_Pavel
 
07.02.12
08:28
(23) Ага, расписали, сам вижу что ничего плохого. К чему ты это?
27 andrewks
 
07.02.12
08:29
(20) "кроме того что в (1) возвращает не целое число" сфигаль?
28 SeraFim
 
07.02.12
08:30
(12) вообще, всё зависит от контекста. Если нужно единоразово вычислить, то лучше (1) (с небольшим изменениев в виде НачалоДня())
Если нужно обработать большие объемы, то РазностьДат(&Дата1,&Дата2,День) нужно писать непосредственно в запросе.
А так - посмотрел бы я на тебя, если б ты крутил (6) в запросе.
Так что смысла от данной функции не вижу.
29 D_Pavel
 
07.02.12
08:30
(27) бывает.
30 SeraFim
 
07.02.12
08:31
(27) зависит от того, что в датах. Если там "Дата и Время", то вполне может
31 andrewks
 
07.02.12
08:32
(29)(30) пример?
32 ASU_Diamond
 
07.02.12
08:32
а внимательно вопрос читали?
интересно как ТС собирается получить разность строк в днях?
33 D_Pavel
 
07.02.12
08:33
(28) >>А так - посмотрел бы я на тебя, если б ты крутил (6) в запросе.
Она и так в запросе крутится. Там такая функция изначально есть, "с завода".
34 SeraFim
 
07.02.12
08:34
(33) пардон, опечатался.
(28) читать так: "посмотрел бы я на тебя, если б ты крутил (6) в цикле."
35 D_Pavel
 
07.02.12
08:35
(32) Там просто нужно отменить перевод в строку, и работать с датами.
36 D_Pavel
 
07.02.12
08:36
(34) Я бы так не делал. В циклах обычно разбирается результат запроса, а в запросе функция РазностьДат и так есть.
37 andrewks
 
07.02.12
08:39
+(31)ну что, пример будет?
38 SeraFim
 
07.02.12
08:40
(37) пожалуйста:
   Дата1 = '2012-02-04 09:39:41';
   Дата2 = '2012-02-02 00:00:00';
   Сообщить((Дата1 - Дата2)/86400);                        //2,40255787037037037037037037
   Сообщить((НачалоДня(Дата1) - НачалоДня(Дата2))/86400);    //2
39 D_Pavel
 
07.02.12
08:40
(21) Это просто другой способ, довольно коротко написанный, а не увеличенный по размеру первый способ.
40 LivingStar
 
07.02.12
08:41
а вот интересный момент!!!

Дата1= 19.10.2011 0:00:00
Дата2= 17.10.2011 23:59:59

в резкльтате получается:

(Дата1 - Дата2)/86400 = 1,000011574074074074074074074

в этом случае просто брать целую часть? или просто брать её всегда???!
41 andrewks
 
07.02.12
08:43
(38) а, так вы про _результат_ в днях?
а я-то думал... :)))

ну, функции округления ещё никто не отменял
42 LivingStar
 
07.02.12
08:43
(40+)  на начало дня то есть нужно брать просто
43 andrewks
 
07.02.12
08:48
(42) как тебе надо, так и бери. мы же не знаем твоей задачи. иногда и в дробных днях считать надо
44 LivingStar
 
07.02.12
09:08
кажется в этом методе есть проблема (Дата1 - Дата2) /86400
к примеру
Дата1= 31.10.2011 0:00:00
Дата2= 28.10.2011 0:00:00

то результат будет 3, а нужно вообще ничего

а почему то у меня РазностьДат() вообще процедура или функция с указанным именем не определена
45 LivingStar
 
07.02.12
09:09
(44+) или с этим методом все правильно, он просто возвратил положительное значение (Дата1 - Дата2) /86400
46 andrewks
 
07.02.12
09:18
(44) "то результат будет 3, а нужно вообще ничего" О_о
47 Aprobator
 
07.02.12
09:26
до чего же некоторые люди не любят признавать свою неправоту.
48 Ненавижу 1С
 
гуру
07.02.12
09:27
(44) почему Ничего? и кстати, "Ничего" такого нет в 1С еще пока, вот есть Неопределено и NULL
49 andrewks
 
07.02.12
09:28
(48) да, Nothing очень нам не хватает...
50 zelebobi4
 
07.02.12
09:29
(44) А почему "ничего"??
51 LivingStar
 
07.02.12
09:34
(44) да просто мне нужно было в этом случае ничего не выводить в печатную форму
метод правильно работает!!!! возвратил положительное число!

Скажите а почему у меня не работает функция РазностьДат() ?
52 LivingStar
 
07.02.12
09:34
(51) то (50)
53 Новиков
 
07.02.12
09:52
...Велосипеды...велосипеды...

ОбщегоНазначения.РазобратьРазностьДат - ЗУП

БухгалтерскийУчет.РазностьДатВДнях - БП

...и так далее и так далее и так далее...
54 vmv
 
07.02.12
09:59
53. чушь, там только в днях - это просто, ты попробуй со временем также делать, причем не разово, а например использовать механизм для постороения периодических технологических периодов.

В производстве технологические периоды физической продолжительностью более суток, например смена начало 8:00 текущего дня и 8:00 часов следующего дня используется часто. Причем в этом технологическом периоде нужно снимать показания с приборов: по графику каждый час, каждые полчаса, каждые 10 минут.
И таких графиков может быть произвольное количество. Параметры согласно графику пишуться в регистр сведений на датуиввремя снятия показаний

так что ваща буха маягко говоря сосет в этой задаче
55 Stim
 
07.02.12
10:00
(1) неверно. правильнее писать

(Дата1 - Дата2) /(60*60*24)
56 Новиков
 
07.02.12
10:04
(54)  читаю в (0): как можно получить разность 2х дат?.

Привожу примеры.

Ты пишешь: "там только в днях "

Вопрос к тебе. Читаем вопрос темы в (1)? как между ними (датами) получить разность в днях?. Ты пишешь: там только в днях".

Ты в сознании? Причем тут кто у кого сосет? Ты читать умеешь? Или 22 см не вмещается в ширинке?
57 vmv
 
07.02.12
10:08
(56) дата в себе несет и время с физической точки зрения, рассмотрение ее только в днях - упрощение для тьоток
58 vmv
 
07.02.12
10:10
да вечно в типовых понапихают кастрированые методы, ведь получить полную разность дат со временем вполне реально, не скажу как - сами думайте)
59 LivingStar
 
21.02.12
10:46
то что в (55) выдавало не тот результат, не зная как это применить, или вывести правильнее, использовал функцию типовой конфигурации УПП:

ОбщегоНазначения.РазобратьРазностьДат(НачалоДня(Рез.СрокПлатежа), НачалоДня(ОтборДатаКон), Лет, Месяцев, Дней);

выдала она корректный результат....
60 Ненавижу 1С
 
гуру
21.02.12
10:56
(59) не прошло и месяца
61 LivingStar
 
21.02.12
11:01
(60) блин раз выдала второй раз не выдает уже ((((
62 Ненавижу 1С
 
гуру
21.02.12
11:02
(61) гыгы
63 НЕА123
 
21.02.12
11:02
(61)
это Ненавижу 1С сглазил.
64 LivingStar
 
21.02.12
11:03
31.01.2011
31.12.2011
ОбщегоНазначения.РазобратьРазностьДат(НачалоДня(Рез.СрокПлатежа), НачалоДня(ОтборДатаКон), Лет, Месяцев, Дней);

Дней = 0 ((((

(НачалоДня(Рез.СрокПлатежа) - НачалоДня(ОтборДатаКон)) /(60*60*24)

показывает -334
65 LivingStar
 
21.02.12
11:03
или что то я не то делаю?
66 LivingStar
 
21.02.12
11:04
да не все верно
нужно расчитать просрочку платеда
вторая дата больше первой !!!
67 НЕА123
 
21.02.12
11:04
(61)
вообще-то что ты хотел? сейчас Масленица, вот "блин" и, как положено, получился.
68 LivingStar
 
21.02.12
11:05
ой, посмотрел код процедуры, тама передавать нужно их видимо в обратном порядке
69 LivingStar
 
21.02.12
11:08
вообще нужно вроде передавать именно в том в котором передаю....
70 Aprobator
 
21.02.12
11:09
(65) ты просто не тем занимаешься.
71 Reset
 
21.02.12
11:10
Хоспаде...
72 LivingStar
 
21.02.12
11:16
(70) в смысле чего не тем???
73 hhhh
 
21.02.12
11:42
(72) ну если отнять 31.01.2011 - 31.12.2011 должно получиться -334. Я проверил. Правильно у тебя считает. Непонятно, почему переживаешь.
74 LivingStar
 
21.02.12
11:43
(73) ясно типовая функция просто не считает такие даты, а эта считает...
75 Fish
 
21.02.12
11:46
(74) Типовая тоже считает, если код посмотреть :))))
76 LivingStar
 
21.02.12
11:50
(75) она вообще пропускает это так как первая дата меньше второй, процедура не выполняется, а если поменять даты то теряется суть
77 Fish
 
21.02.12
11:52
(76) Суть чего поменяется? Если ты из меньшего числа вычтешь бОльшее, то всегда получишь отрицательное число. Или ты математику в школе не учил? :)))