powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вычисление разницы между датами
25 сообщений из 48, страница 1 из 2
Вычисление разницы между датами
    #38720918
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые здравствуйте !

Есть необходимость вычисление разницы между двумя датами.
Например 06.08.1987 и сегодняшней, т.е. 15.08.2014
Как средствами COS вычислить сколько лет, месяцев, дней прошло ?

Спасибо.
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38720922
vassil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/// Количество месяцев между датами
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)
}
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38720928
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vassil,
Спасибо большое, хотелось это делать не пользуясь классами...
Работаю с использованием прямого доступа, используя классический MUMPS.
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38720935
vassil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,
Думаю по аналогии можно переписать. На классическом MUMPS'е не пишу, поэтому боюсь что-нибудь напутать :)
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38720950
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38720967
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,
Спасибо. Кода многовато конечно ...
ОК. Попробуем разобраться.
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38720973
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuКода многовато конечно ...
У нас дата используется в 3-х вариантах + 1 модификация... Да и сами функции писаны сверх защищенно...

Если убрать защиту... Сократить форматы дат - будет меньше кода.
Но это писалось один раз и черти когда. А потом просто использовалось всеми и проблем небыло.
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38720976
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuКода многовато конечно ...
На МСМе было еще больше.
Поскольку там небыло функций перевода даты в хоролог и обратно... Все это так же вычислялось самостоятельно...
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38720979
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С условием явно перемудрили...
Вот более понятный вариант. s:Type=1&'$d(%korr) dt=$$IncDay(dt,$s(Num<0:1,1:-1)) 
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38720991
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa s:Type=1&'$d(%korr) Не стоит писать так условия с одним & или !, нужно писать с двойным && или ||
когда вы пишите с одним знаком, второе выражение все равно будет вычисляться
а если с двойным, то завершится при первом подходящем варианте
пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	set a=-1 if $increment(a) & $increment(a) {} zwrite a
a=1

	set a=-1 if $increment(a) && $increment(a) {} zwrite a
a=0

	set a=0 if $increment(a) ! $increment(a) {} zwrite a
a=2

	set a=0 if $increment(a) || $increment(a) {} zwrite a
a=1
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38721011
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorНе стоит писать так условия с одним & или !, нужно писать с двойным && или ||
Я сделаю плакат с твоими рекомендациями и повешу у входа, дабы все видели.
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38721023
Фотография 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)
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38721033
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)
Не факт что автору нужно "всего дней" с первой даты по вторую...
А как раз все сложность именно в тех днях, которых не хватает до месяца.
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38721062
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,
Да, хотелось более универсально и для других MUMPS систем.
Для GT.M например.

Спасибо.
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38721063
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38721066
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriukrvsa,
Да, хотелось более универсально и для других MUMPS систем.
Для GT.M например.

Спасибо.Вы попросили COS, я и предложил COS, тогда нужно было сразу просить на чистом M
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38721085
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor,
:) Прошу прощения за неточность.
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38721093
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuДля GT.M например.
Там есть перевод Дд.Мм.ВвГг в хоролог и обратно?
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38721134
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,
Как бы там у них все в $zdate и $zdateform
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38721157
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu , просто в МСМе кроме $h ничего с датами и небыло...
Была правда процедурка с проносимыми переменными... Но это вообще фигня.
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38722375
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor,
А системная функция может нам указать сколько дней
имеется в конкретном выбранном месяце ?

Спасибо.
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38722404
Petr0vi4444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)
}
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38722408
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuDAiMor,
А системная функция может нам указать сколько дней
имеется в конкретном выбранном месяце ?

Спасибо.Может вернуть последний день для текущего месяца
так
Код: plaintext
w $zd($SYSTEM.SQL.LASTDAY($h))
либо так
Код: plaintext
w $zd($SYSTEM.SQL.LASTDAY("2014-01-1"))
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38722416
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor,
У меня версия старая 5.0.
Этого метода нету вроде...
...
Рейтинг: 0 / 0
Вычисление разницы между датами
    #38722438
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuDAiMor,
У меня версия старая 5.0.
Этого метода нету вроде...Да, похоже, что появилась она только в 2011 версии
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вычисление разницы между датами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]