powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как бы лучше работать с Дата/Время?
6 сообщений из 6, страница 1 из 1
Как бы лучше работать с Дата/Время?
    #35380813
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы лучше работать с Дата/Время? Имеется ввиду ввод, хранение и чтение...

До этого использовали только свойства типа %Date... Но теперь нужно и время. Все еще усложняется тем, что данные будут вводить в CSP-страничке, а потом это все будет записываться в DBF-файл.
Форматы нужны в итоге такие:
ТипФорматДатаДД.ММ.ГГГГВремяЧЧ:ММ:СС
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Как бы лучше работать с Дата/Время?
    #35381177
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я использую %TimeStamp (поддерживается UTC).

Формат даты/времени лучше настроить один раз в локали, например (для версии 2008.2.FT2):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    <DateFormat> 4 </DateFormat>
    <DateMaximum> 2980013 </DateMaximum>
    <DateMinimum> 0 </DateMinimum>
    <DateSeparator>.</DateSeparator>
    <TimeFormat> 1 </TimeFormat>
    <TimePrecision> 0 </TimePrecision>
    <TimeSeparator>:</TimeSeparator>
В SQL для работы пригодятся:
Код: plaintext
1.
2.
3.
4.
{fn TIMESTAMPADD(...)}
{fn TIMESTAMPDIFF(...)}
{ts '2008-06-18 17:50:00'}
CURRENT_TIMESTAMP
В COS:
Код: plaintext
1.
2.
3.
4.
5.
$ZT(...)
$ZTH
$ZDT
$ZDTH
$ZTS
$ZTZ
...
Рейтинг: 0 / 0
Как бы лучше работать с Дата/Время?
    #35381628
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitЯ использую %TimeStamp
Вот что-то и я к нему склоняюсь... Но пока терзают сомнения.
...
Рейтинг: 0 / 0
Как бы лучше работать с Дата/Время?
    #35383301
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, правильно терзают :) Выбор формата хранения данных в БД в последнюю очередь должен зависеть от формата выходных данных, а в первую очередь - от того, какие запросы будут преобладать. E.g., будет ли поиск по дате и по интервалам дат, будет ли отдельный поиск по времени.
Представьте, что у вас будет поиск по дате и по интервалам дат (но не времени), тогда при формате TIMESTAMP время ляжет избыточным бременем на индекс, следовательно, замедлится и скорость. Либо придется делать вычисляемые поля и строить индекс по ним - не головная боль ли это?
Это соображения сугубо прагматические, "классиков", возможно, еще покоробило бы, что тип TIMESTAMP противоречит 1НФ. Мы не будем об этом спорить :) Я когда-то тоже мучился подобным выбором, и выбрал раздельное хранение Date и Time (в стандартном формате Cache) именно погоняв запросы, которые на этапе проектирования считались типовыми :)
...
Рейтинг: 0 / 0
Как бы лучше работать с Дата/Время?
    #35384112
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моем случае запросы "не давят", т.к. табличка будет небольшая... Вот и думаю может потренироваться на ней?
Задачка у меня следующая -
- Ответственный работник монтирует областную БД
- Указывает дату и время ее актуальности
- Я провожу некие манипуляции с этой БД с целью получить из нее ряд таблиц
- Полученные таблицы записываю в dbf-фалы для отправки в министерство
- Для этого "пакета" файлов создается файл "этикетка". В который, помимо всего прочего, нужно записать на какое число и время были актуальны данные. Если сведения не "полные", т.е. шлю не всю информацию, а только "изменения", нужно еще указать дату и время предыдущей актуальности БД, которую отсылали последний раз

Отсюда решаю следующие вопросы:
- Ввод даты и времени из csp-страницы. Хранение их в неком классе вместе с другими установочными данными
- Создание таблички где будет храниться история "актуальностей" обработанных БД

Когда в csp делаю привязку объекта к форме даты записываю в формате ММ/ДД/ГГГГ, а время ЧЧ:ММ:СС (это если хранить в разных полях) - все нормально сохраняется.
А как выполнить ввод или хотя бы запись в поле с типом %TimeStamp?
Т.е. не методом кащейским, а именно через привязку объекта к форме?
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как бы лучше работать с Дата/Время?
    #39277725
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovИМХО, правильно терзают :) Выбор формата хранения данных в БД в последнюю очередь должен зависеть от формата выходных данных, а в первую очередь - от того, какие запросы будут преобладать. E.g., будет ли поиск по дате и по интервалам дат, будет ли отдельный поиск по времени.
Представьте, что у вас будет поиск по дате и по интервалам дат (но не времени), тогда при формате TIMESTAMP время ляжет избыточным бременем на индекс, следовательно, замедлится и скорость. Либо придется делать вычисляемые поля и строить индекс по ним - не головная боль ли это?
Это соображения сугубо прагматические, "классиков", возможно, еще покоробило бы, что тип TIMESTAMP противоречит 1НФ. Мы не будем об этом спорить :) Я когда-то тоже мучился подобным выбором, и выбрал раздельное хранение Date и Time (в стандартном формате Cache) именно погоняв запросы, которые на этапе проектирования считались типовыми :)На DC вышла статья на эту тему: Improve SQL Performance for Date Range Queries
Представленный там трюк подходит лишь для частного случая: когда TimeStamp1 < TimeStamp2 if and only if ID1 < ID2 for all IDs and TimeStamp values in table и в запросах учитывается вся отметка (дата/время) целиком.

В общем случае целесообразней использовать умные индексы , позволяющие очень быстро искать как по отметке целиком, так и её частям или совокупности частей.
Состав подобного индекса со временем может безболезненно дополняться новыми неучтёнными комбинациями.
Кроме того в нём можно хранить данные необязательно в отображаемом виде ["2016-07-01"], а например в логическом [64100] для экономии дисковой памяти.

При всём при этом отметка хранится именно как %TimeStamp, а не два отдельных поля %Date и %Time.
Повторил тест с задействованием "умного" индекса и беспорядочной последовательностью ID:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Class sqlru.TSOrder Extends (%Persistent, %Populate)
{

Index Extent [ Extent, Type = bitmap ];

Index iSmartTS On (TS(KEYS), TS(ELEMENTS));

Index iTS On TS;

Property TS As %TimeStamp(MAXVAL = "2016-07-31 23:59:59.999999", MINVAL = "2016-07-01 00:00:00.000000");

Property Data As %String(MAXLEN = 200, MINLEN = 100);

ClassMethod TSBuildValueArray(
  value,
  ByRef array) As %Status
{
  i value="" {
    s array(0)=value
  }else{
    s date=$p(value," ",1),
    time=$p(value," ",2),
    array("date")=date,
    array("time")=time,
    array("ddhh")=$p(date,"-",3)_"-"_$p(time,":",1)
  }
  q $$$OK
}

ClassMethod Fill(N = {30e6})
{
  d ..%KillExtent(), ..Populate(N), ..%BuildIndices(,,,$$$NO), $system.SQL.TuneTable("sqlru.TSOrder",$$$YES), $system.OBJ.Compile("sqlru.TSOrder","cu-d")
}

}
Результаты из Портала:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select distinct null from sqlru.TSOrder where TS between {ts '2016-07-01 00:00:00.00000'} AND {ts '2016-07-01 23:59:59.999999'}

2.431 cекунд
2107560 глобальных ссылок
(количество выбранных записей 967378, используется обычный индекс)

select distinct null from sqlru.TSOrder where for some %element(TS) (%key='date' and %value = '2016-07-01')

2.332 cекунд
1934766 глобальных ссылок
(количество выбранных записей 967378, используется "умный" индекс)

select distinct null from sqlru.TSOrder where for some %element(TS) (%key='ddhh' and %value = '01-13')

0.102 cекунд
80754 глобальных ссылок
(количество выбранных записей 40372, используется "умный" индекс)

PS: у Kyle ошибка в коде:
Property Data as %String ( MAXLEN =100,  MINLEN =200);
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как бы лучше работать с Дата/Время?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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