powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Индексация по полю DATETIME
6 сообщений из 6, страница 1 из 1
Индексация по полю DATETIME
    #33370055
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как проиндексировать записи по комплексу двух полей:
первое (INTEGER, по возрастанию) + второе (DATETIME, по убыванию) ?
...
Рейтинг: 0 / 0
Индексация по полю DATETIME
    #33370083
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если из одного значения DateTime вычесть другое значение DateTime, то получим их разность в миллисекундах. Если делать вычитание из фиксированного значения DateTime (не важно какого), то чем больше вычитаемое, тем меньше результат. Т.е. упорядочивание по убыванию.

Если intField - это поле типа Integer, а dtField - это поле типа DateTime, то можно примерно так:

Код: plaintext
INDEX ON STR(intField)+STR(DateTime( 3000 , 1 , 1 )-dtField, 15 ) TAG SortOrd

Такой способ задания контстанты типа DateTime появился только в VFP6. Для ранних версий надо писать константу другим способом.
...
Рейтинг: 0 / 0
Индексация по полю DATETIME
    #33370111
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi men dea!

Нечто типа.

BINTOC(nIntegerField, 4) + STR(DATETIME(9999,12,31,0,0,0) - tDateTimeField,
12, 0)

Если могут быть пустые даты - то избавься от них (IIF в старых версиях
фокса, EVL () в 9-ке - заменяй по смыслу - на DATETIME(1601,1,1) или на 9999
год...) если в поле с целым числом могут быть символы переполнения (по
простому говоря "звёздочки") - то вместо компактного BINTOC() придётся
пользовать раздутый STR(nIntegerField, 10)...
Можно в принципе и второе число попытаться завернуть в BINTOC() - но для
этого придётся взять за базу не 9999 год, а что-то гораздо более
близкое -чтоб по размерности разности (она кстати в секундах) не выходить за
пределы целого числа...
Ессно что BINTOC() диктует использование COLLATE=MACHINE

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Индексация по полю DATETIME
    #33370216
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобще говоря, построение композитного индекса с убыванием и возростанием по разным полям одновременно, это не тривиальная задача.
Я для построения композитных индексов по возрастанию и по убыванию использую две функции (используется в моем классе SMART_GRID): NumToStr и Revers,
через которые "пропускаю" поля любого типа, когда требуется строить композитный индекс. Все приводится к символьному типу:
Перевод числа в символ:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
FUNCTION NumToStr
	LPARAMETERS luStr, lnPrecision, lnScale
	m.luStr = NVL(m.luStr,  0 )
	m.lnPrecision = IIF(VARTYPE(m.lnPrecision)=="N", m.lnPrecision,  18 )
	m.lnScale = IIF(VARTYPE(m.lnScale)=="N", m.lnScale,  2 )
	RETURN IIF(m.luStr <  0 , 'A', 'Z') + ;
		IIF(m.luStr <  0 , STR(- 99999999999999 . 99  - m.luStr,m.lnPrecision,m.lnScale), ;
		STR(m.luStr,m.lnPrecision,m.lnScale))
ENDFUNC
"Реверсивный" перевод "всего" к символу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
FUNCTION Revers
	LPARAMETERS luStr, lnPrecision, lnScale
	DO CASE
		CASE VARTYPE(m.luStr) = "T"
			RETURN Revers(TTOC(m.luStr, 1 ))
		CASE VARTYPE(m.luStr) == "C"
			m.luStr = CHRTRAN(NVL(m.luStr, ""), ["э], [э"])
			RETURN CHRTRAN(m.luStr, " !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Ёё№АБВГДЕЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьюя", ;
				"яюьыъщшчцхфутсрпонмлкйизжедгвбаЯЮЭЬЫЪЩШЧЦХФУТСРПОНМЛКЙИЗЕДГВБА№ёЁ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#! ")
		CASE VARTYPE(m.luStr) == "N"
			m.lnPrecision = IIF(VARTYPE(m.lnPrecision)=="N", m.lnPrecision,  18 )
			m.lnScale = IIF(VARTYPE(m.lnScale)=="N", m.lnScale,  2 )
			RETURN Revers( NumToStr(m.luStr, m.lnPrecision, m.lnScale ))
		CASE VARTYPE(m.luStr) = "D"
			m.luStr = NVL(m.luStr, {})
			RETURN  STR( 99999999  - VAL(DTOS(m.luStr)))
		OTHERWISE
			RETURN ""
	ENDCASE
ENDFUNC
Функция использует рекурсивный вызов себя при типе данных T (DateTIme) и D (Date)
Тогда для твоего примера индексное выражение будет выглядить так:
Код: plaintext
INDEX ON NumToStr(Field1,  10 ,  0 )  + Revers(Field2) TAG Tag1

С уважением, Алексей.
...
Рейтинг: 0 / 0
Индексация по полю DATETIME
    #33370433
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблемы ? что ли
index on str(f_int,n,m)+str(40000000-val(dos(f_date)),8) to .....
...
Рейтинг: 0 / 0
Индексация по полю DATETIME
    #33370439
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой еще веремя извените не дочитал
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Индексация по полю DATETIME
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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