Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как бы лучше работать с Дата/Время? / 6 сообщений из 6, страница 1 из 1
18.06.2008, 16:55
    #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
18.06.2008, 18:56
    #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
19.06.2008, 08:08
    #35381628
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бы лучше работать с Дата/Время?
servitЯ использую %TimeStamp
Вот что-то и я к нему склоняюсь... Но пока терзают сомнения.
...
Рейтинг: 0 / 0
19.06.2008, 16:47
    #35383301
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бы лучше работать с Дата/Время?
ИМХО, правильно терзают :) Выбор формата хранения данных в БД в последнюю очередь должен зависеть от формата выходных данных, а в первую очередь - от того, какие запросы будут преобладать. E.g., будет ли поиск по дате и по интервалам дат, будет ли отдельный поиск по времени.
Представьте, что у вас будет поиск по дате и по интервалам дат (но не времени), тогда при формате TIMESTAMP время ляжет избыточным бременем на индекс, следовательно, замедлится и скорость. Либо придется делать вычисляемые поля и строить индекс по ним - не головная боль ли это?
Это соображения сугубо прагматические, "классиков", возможно, еще покоробило бы, что тип TIMESTAMP противоречит 1НФ. Мы не будем об этом спорить :) Я когда-то тоже мучился подобным выбором, и выбрал раздельное хранение Date и Time (в стандартном формате Cache) именно погоняв запросы, которые на этапе проектирования считались типовыми :)
...
Рейтинг: 0 / 0
20.06.2008, 08:19
    #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
Период между сообщениями больше года.
21.07.2016, 12:37
    #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
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как бы лучше работать с Дата/Время? / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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