|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
Уважаемые здравствуйте ! Есть необходимость вычисление разницы между двумя датами. Например 06.08.1987 и сегодняшней, т.е. 15.08.2014 Как средствами COS вычислить сколько лет, месяцев, дней прошло ? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 09:12 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
/// Количество месяцев между датами ClassMethod GetCountOfMonth(date1 As p6.dt.Date = "", date2 As p6.dt.Date = "") As %Integer { if ((date1="") || (date2="")) { quit "" } //# set tempDate=date1 set count=0 while (tempDate<date2) { set tempDate=..GetFirstDayOfNextMonth(tempDate) set count=count+1 } quit count } /// возвращает дату = первое число того месяца который после месяца в date ClassMethod GetFirstDayOfNextMonth(date As p6.dt.Date = "") As p6.dt.Date { if (date="") quit "" set dateString = $zdate(date,3) set $piece(dateString,"-",3)="01" set month = $Piece(dateString,"-",2) if (+month=12) { set year = $Piece(dateString,"-",1) set $piece(dateString,"-",2)="01" set $piece(dateString,"-",1)=year+1 } else { set $piece(dateString,"-",2)=month+1 } quit $zdateh(dateString,3) } ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 09:21 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
vassil, Спасибо большое, хотелось это делать не пользуясь классами... Работаю с использованием прямого доступа, используя классический MUMPS. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 09:30 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
Valeriu, Думаю по аналогии можно переписать. На классическом MUMPS'е не пишу, поэтому боюсь что-нибудь напутать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 09:40 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
Valeriuиспользуя классический MUMPS. Мамсее некуда... n s dt1="06.08.1987" s dt2="15.08.2014" s val=$$MonDay(dt1,dt2) w !,val q /// Число месяцев и дней в периоде MonDay(Ds,Dp) n exit,dt1,dt2,mon,day,i s:Ds'["." Ds=$$hd(Ds) s:Dp'["." Dp=$$hd(Dp) q:Ds[" " "" q:Dp[" " "" s dt2=$$dh(Dp) q:$$dh(Ds)>dt2 "" s dt1=Ds s mon=0 s exit=0 f i=1:1 d NEXTMON q:exit s day=dt2-$$dh(dt1)+(mon=0) q mon_","_day NEXTMON ; Следующий месяц n val s val=$$NewDate(Ds,i,1) i $$dh(val)>dt2 s exit=1 q s mon=i s dt1=val q /// Новая дата через Num месяцев NewDate(Date,Num,Type) ; Date - дата ; Num - количество месяцев ; Type - 1 уменьшить на день, если дни совпадают ; %korr - был или нет подбор даты n tp,ln,ms,newms,newyear,day,dt,hr,dt1,dat s Num=$g(Num,1) s Type=$g(Type) k %korr q:'Num Date s:Date["," Date=+Date s ln=$l(Date) s tp=$s(ln=10:1,ln=8:2,1:3) s:tp=3 Date=$$hd(Date) s:tp=2 Date=$$hd($$dh(Date)) i Date[" " zt "EmptyDate" s ms=$p(Date,".",2) s newms=ms+Num s newyear=newms-0.5\12+$p(Date,".",3) s:newms<1 newyear=newyear-1 s newms=$tr($j(newms#12,2)," ",0) s newyear=$tr(newyear," ",0) s:'newms newms=newms+12 s day=$p(Date,".") s dt="01."_newms_"."_newyear s dt=$$dh(dt)+day-1 d KORRDATE s:Type=1&'$d(%korr) dt=$$IncDay(dt,$s(-1*Num<0:-1,1:1)) s dat=$$format(dt,tp) q dat KORRDATE ; Подбор дня n hr,i q:dt'>0 s hr=dt f i=hr:-1 s dt=$$hd(i) q:$p(dt,".",2)=newms s:i'=hr %korr=1 q /// Инкремент даты в формате +$H и DD.MM.YYYY IncDay(Date,Inc) n typ s:$g(Date)="" Date=+$H i Date[" " zt "EmptyDate" s Inc=$g(Inc,1) s typ=1 i Date["." s Date=$$dh(Date),typ=2 s Date=Date+Inc q $s(typ=1:Date,1:$$dh(Date)) /// Форматировать дату format(Date,Type) q:Type=1 Date i Type=2 s $e(Date,7,8)="" q Date q $$dh(Date) /// $h -> Dd.Mm.WwYy hd(Hor) q:'$g(Hor) "" q $tr("Dd.Mm.WwYy","WwYy-Mm-Dd",$zd(Hor,3)) /// Dd.Mm.WwYy -> $h dh(Date) q:'$g(Date) "" q:Date'["." Date s Date=$tr("WwYy-Mm-Dd","Dd.Mm.WwYy",Date) q $zdh(Date,3) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 09:56 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
krvsa, Спасибо. Кода многовато конечно ... ОК. Попробуем разобраться. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 10:27 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
ValeriuКода многовато конечно ... У нас дата используется в 3-х вариантах + 1 модификация... Да и сами функции писаны сверх защищенно... Если убрать защиту... Сократить форматы дат - будет меньше кода. Но это писалось один раз и черти когда. А потом просто использовалось всеми и проблем небыло. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 10:35 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
ValeriuКода многовато конечно ... На МСМе было еще больше. Поскольку там небыло функций перевода даты в хоролог и обратно... Все это так же вычислялось самостоятельно... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 10:38 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
С условием явно перемудрили... Вот более понятный вариант. s:Type=1&'$d(%korr) dt=$$IncDay(dt,$s(Num<0:1,1:-1)) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 10:45 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
krvsa s:Type=1&'$d(%korr) Не стоит писать так условия с одним & или !, нужно писать с двойным && или || когда вы пишите с одним знаком, второе выражение все равно будет вычисляться а если с двойным, то завершится при первом подходящем варианте пример Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 10:52 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
DAiMorНе стоит писать так условия с одним & или !, нужно писать с двойным && или || Я сделаю плакат с твоими рекомендациями и повешу у входа, дабы все видели. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 11:05 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
а по теме, есть уже все готовое для поиска разницы дат, это sql функция DATEDIFF set date1="06.08.1987" set date1=$zdateh($translate(date1,".","/"),4) set date2=$piece($horolog,",") write !,"years: ",$system.SQL.DATEDIFF("yy",date1,date2) write !,"months: ",$system.SQL.DATEDIFF("mm",date1,date2) write !,"weeks: ",$system.SQL.DATEDIFF("wk",date1,date2) write !,"days: ",$system.SQL.DATEDIFF("dd",date1,date2) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 11:12 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
DAiMorа по теме, есть уже все готовое для поиска разницы дат, это sql функция DATEDIFF set date1="06.08.1987" set date1=$zdateh($translate(date1,".","/"),4) set date2=$piece($horolog,",") write !,"years: ",$system.SQL.DATEDIFF("yy",date1,date2) write !,"months: ",$system.SQL.DATEDIFF("mm",date1,date2) write !,"weeks: ",$system.SQL.DATEDIFF("wk",date1,date2) write !,"days: ",$system.SQL.DATEDIFF("dd",date1,date2) Не факт что автору нужно "всего дней" с первой даты по вторую... А как раз все сложность именно в тех днях, которых не хватает до месяца. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 11:20 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
krvsa, Да, хотелось более универсально и для других MUMPS систем. Для GT.M например. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 11:39 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
krvsaА как раз все сложность именно в тех днях, которых не хватает до месяца.В этом поможет другая SQL функция DATEADD set date1="06.05.1987" set date1=$zdateh($translate(date1,".","/"),4) set date2=$piece($horolog,",") set dateTemp=date1 set years=$system.SQL.DATEDIFF("yy",date1,date2) set dateTemp=$system.SQL.DATEADD("yy",years,dateTemp) set months=$system.SQL.DATEDIFF("mm",dateTemp,date2) set dateTemp=$system.SQL.DATEADD("mm",months,dateTemp) set days=$system.SQL.DATEDIFF("dd",dateTemp,date2) zwrite years,months,days ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 11:39 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
Valeriukrvsa, Да, хотелось более универсально и для других MUMPS систем. Для GT.M например. Спасибо.Вы попросили COS, я и предложил COS, тогда нужно было сразу просить на чистом M ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 11:40 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
DAiMor, :) Прошу прощения за неточность. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 11:49 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
ValeriuДля GT.M например. Там есть перевод Дд.Мм.ВвГг в хоролог и обратно? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 11:56 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
krvsa, Как бы там у них все в $zdate и $zdateform ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 12:23 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
Valeriu , просто в МСМе кроме $h ничего с датами и небыло... Была правда процедурка с проносимыми переменными... Но это вообще фигня. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 12:45 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
DAiMor, А системная функция может нам указать сколько дней имеется в конкретном выбранном месяце ? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2014, 12:40 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
Valeriu, По-моему это довольно просто рассчитывается/// Проверка является ли год Високосным ClassMethod isLeapYear(year As %Integer) As %Boolean [ Final ] { Quit:(year#4 '= 0) 0 Quit:(year#400 = 0) 1 Quit:(year#100 = 0) 0 Quit 1 } /// Получить количество дней в месяце в указанном году ClassMethod getDaysInMonth(year As %Integer, month As %Integer) As %Integer [ Final ] { Quit +$P("31,28,31,30,31,30,31,31,30,31,30,31",",",month)+$S((month=2)&&..isLeapYear(year):1,1:0) } ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2014, 12:55 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
ValeriuDAiMor, А системная функция может нам указать сколько дней имеется в конкретном выбранном месяце ? Спасибо.Может вернуть последний день для текущего месяца так Код: plaintext
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2014, 12:58 |
|
Вычисление разницы между датами
|
|||
---|---|---|---|
#18+
DAiMor, У меня версия старая 5.0. Этого метода нету вроде... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2014, 13:04 |
|
|
start [/forum/topic.php?fid=39&tid=1556812]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 274ms |
total: | 415ms |
0 / 0 |