powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как проверить вхождение даты в интервал?
11 сообщений из 11, страница 1 из 1
Как проверить вхождение даты в интервал?
    #37640453
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот чем мне "нравится" Cache, с любой фигней можно возиться бесконечно долго...
Не могу понять как проверить вхождение даты в интервал? Перепробовал кучу вариантов, с "between", "convert", "cast", "to_date" и т.д. и т.п.
Сейчас остановился на таком:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
testInt(today,birthday) public
{
	s tDate = $system.SQL.TOTIMESTAMP(today,"YYYY-MM-DD")
	s minDate = $system.SQL.DATEADD("day",-7,birthday)
	s maxDate = $system.SQL.DATEADD("day",7,birthday)
	w !,"Сегодня "_tDate
	w !,"Минимум "_minDate
	w !,"Максимум "_maxDate
	if (tDate >= minDate) && (tDate <= maxDate) {
		w !,"Входит в интервал"
	} else {
		w !,"НЕ входит в интервал"
	}
}


Проверяю так:
d testInt^debug("2011-12-17","2011-12-25")
Сегодня 2011-12-17 00:00:00
Минимум 2011-12-18 00:00:00
Максимум 2012-01-01 00:00:00
Входит в интервал

Почему? Видимо сравниваются "как строки" все-таки? Хотя логика сравнения строк в Cache для меня тоже загадка:
w ("2011-12-17 00:00:00" >= "2011-12-18 00:00:00")
1
w ("2011-12-17 00:00:00" <= "2011-12-18 00:00:00")
1

Но это отдельный вопрос. Сейчас мне бы понять, как с датами тут работа организована?
...
Рейтинг: 0 / 0
Как проверить вхождение даты в интервал?
    #37640490
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чет я вас не очень понимаю пока. Даты это числа и как числа сравниваются.
...
Рейтинг: 0 / 0
Как проверить вхождение даты в интервал?
    #37640504
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
coder1cv8 ,
Строки не сравниваются операторами больше/меньше. В вашем примере при использовании операторов <= и >= строки приводятся к числам, а они равны (2011).
Используйте строковые операторы .

Блок А.Н.Даты это числа и как числа сравниваются.
$SYSTEM.SQL.DATEADD() возвращает TIMESTAMP, а это всего лишь строка.
...
Рейтинг: 0 / 0
Как проверить вхождение даты в интервал?
    #37640611
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8Вот чем мне "нравится" Cache, с любой фигней можно возиться бесконечно долго... Data Formats and Translation Methods

Представление одной и той же даты в разных форматах:
Logical[Storage]: 62487

Display: 31.01.2012 (зависит от настроек Вашей локали)

ODBC: 2012-01-31

coder1cv8Перепробовал кучу вариантов, с "between", "convert", "cast", "to_date" и т.д. и т.п.Похоже на SQL, поэтому и пример привожу для SQL:

Class del.d Extends %Persistent
{

Property birthday As %Date;

ClassMethod Test()
{
  d ..%KillExtent()
  &sql(insert into del.d(birthday) values({d '2012-01-29'}))
  
  &sql(select count(*) into :r from del.d where current_date between birthday-7 and birthday+7)
  #; current_date between birthday-7 and birthday+7 => 62487 between 62485-7 and 62485+7
  w r,! ; Результат при текущей дате "31.01.2012" = 1
}

}
...
Рейтинг: 0 / 0
Как проверить вхождение даты в интервал?
    #37640641
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8,
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
/// Проверяет пересечение диапазона p1 c диапазоном p2
/// <var>p1s</var> и <var>p1e</var> - начало и конец периода в 3-формате: 2011-05-12 00:00:00 
ClassMethod Intersect(p1s As %String, p1e As %String, p2s As %String, p2e As %String) As %Boolean [ SqlProc ]
{
 ;оператор p1]p2 - p1 следует за p2 по временной шкале
 Q:(p1s]p2s)&&(p2e]p1s) 1 ;начало периода p1 находится между началом и концом периода p2
 Q:(p1e]p2s)&&(p2e]p1e) 1 ;конец периода p1 находится между началом и концом периода p2
 Q:(p1s=p2s)&&(p1e=p2e) 1 ;периоды полностью совпадают, а следовательно пересекаются
 Q 0 ;пересечений не обнаружено
}

/// Содержит ли диапазон p1 c диапазон p2
/// <var>p1s</var> и <var>p1e</var> - начало и конец периода в 3-формате: 2011-05-12 00:00:00 
ClassMethod Contain(p1s As %String, p1e As %String, p2s As %String, p2e As %String) As %Boolean [ SqlProc ]
{
 ;оператор p1]p2 - p1 следует за p2 по временной шкале
 Q:(p2s]p1s)&&(p1e]p2e) 1 ;период p1 накрывает период p2
 Q:(p1s=p2s)&&(p1e]p2e) 1 ;начало периодов совпадают, конец p1 следует за p2,  следовательно содержит
 Q:(p2s]p1s)&&(p1e=p2e) 1 ;начало периода p2s следует за p1, а окончания совпадают,  следовательно содержит
 Q:(p1s=p2s)&&(p1e=p2e) 1 ;периоды совпадают, следовательно содержит
 Q 0 ;не содержит
}
...
Рейтинг: 0 / 0
Как проверить вхождение даты в интервал?
    #37641279
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага! Значит все эти %Date, %TimeStamp-ы это просто строки и чтобы сравнить их как даты, нужно привести их к формату хоролога, используя $zdh видимо, то есть мой пример должен выглядеть так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
testInt(today,birthday) public
{
	s tDate = $zdh(today,3)
	s minDate = $zdh($system.SQL.DATEADD("day",-7,birthday),3)
	s maxDate = $zdh($system.SQL.DATEADD("day",7,birthday),3)
	w !,"Сегодня "_$zd(tDate,3)
	w !,"Минимум "_$zd(minDate,3)
	w !,"Максимум "_$zd(maxDate,3)
	if (tDate >= minDate) && (tDate <= maxDate) {
		w !,"Входит в интервал"
	} else {
		w !,"НЕ входит в интервал"
	}
}
...
Рейтинг: 0 / 0
Как проверить вхождение даты в интервал?
    #37641281
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
doublefint , спасибо за готовое решение! ) Оригинальный ход! А такое "сравнение строками" для всех случаев корректно работает?
...
Рейтинг: 0 / 0
Как проверить вхождение даты в интервал?
    #37641431
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8Ага! Значит все эти %Date, %TimeStamp-ы это просто строки и чтобы сравнить их как даты, нужно привести их к формату хоролога, используя $zdh видимоЕсли Вы работаете только с датой без времени, то можно поступить проще:

testInt(today,birthday) public
{
  s tDate = $zdh(today,3)
  s minDate = $zdh(birthday,3)-7
  s maxDate = $zdh(birthday,3)+7
  w !,"Сегодня "_$zd(tDate,3)
  w !,"Минимум "_$zd(minDate,3)
  w !,"Максимум "_$zd(maxDate,3)
  if (tDate >= minDate) && (tDate <= maxDate) {
    w !,"Входит в интервал"
  } else {
    w !,"НЕ входит в интервал"
  }
}

Код: plaintext
1.
2.
3.
4.
5.
>d testInt^debug("2011-12-17","2011-12-25")
 
Сегодня 2011-12-17
Минимум 2011-12-18
Максимум 2012-01-01
НЕ входит в интервал
...
Рейтинг: 0 / 0
Как проверить вхождение даты в интервал?
    #37641439
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit , согласен, верное замечание.
...
Рейтинг: 0 / 0
Как проверить вхождение даты в интервал?
    #37641630
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8, насчет всех случаев не знаю, мои тесты проходит, документации соответствует.
...
Рейтинг: 0 / 0
Как проверить вхождение даты в интервал?
    #37641662
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8Ага! Значит все эти %Date, %TimeStamp-ы это просто строки и чтобы сравнить их как даты, нужно привести их к формату хоролога
%TimeStamp - строка, приведете к внутреннему формату - получите строку вида 62488,41965.31368
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
USER>w $now()
62488,41965.31368

USER>w $zdt($now(),3)
2012-02-01 11:40:08

USER>w $zdth($zdt($now(),3),3)
62488,42041
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как проверить вхождение даты в интервал?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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