![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
расчет номера недели в FB через UDF [IB6.x]
fxPavel © (2011-05-04 15:51:00)Необходимо в БД Firebird рассчитать по дате номер недели (1-53). Т.к. стандартной ф-ии нет решил использовать UDF.
Текст UDF:
library MyUDF;
uses
SysUtils,
Classes,
DateUtils;
{$R *.res}
function CalcWeekNum(var ADate: TDateTime): integer; cdecl; export;
begin
Result := DateUtils.WeekOf(ADate);
end;
exports
CalcWeekNum;
begin
end.
далее в FB подцепляем функцию
DECLARE EXTERNAL FUNCTION CALC_WEEK_NUM
DATE
RETURNS INTEGER BY VALUE
ENTRY_POINT 'CalcWeekNum' MODULE_NAME 'MyUDF';
и пишем запрос
SELECT ID, D, CALC_WEEK_NUM(D) FROM DAYDATA ORDER BY ID
никаких ошибок не выскакивает... но результат примерно следующий:
2 21.03.2011 52
3 18.03.2011 52
....
107 19.10.2010 52
108 18.10.2010 52
...
434036 14.06.1990 52
434037 13.06.1990 52
т.е. результат работы ф-ии ВСЕГДА 52...
Подскажите пожта, куда рыть....
PEAKTOP (2011-05-06 11:11:00) [1]> fxPavel © (04.05.11 15:51)
>
> Необходимо в БД Firebird рассчитать по дате номер недели (1-53).
Никогда, слышишь, никогда не указывай версию сервера.
http://firebirdsql.su/doku.php?id=extract
BEGIN
....
P_WEEKNO = TRUNC(EXTRACT(YEARDAY FROM :P_MY_DATE)) + 1;
....
END
Кщд (2011-05-05 15:34:00) [2]>OW © (05.05.11 15:02) [9]
Также, вероятность ошибки у идеи довольно высока, но легко поправляется ручным плюсованием константы.
речь шла о локали)
OW (2011-05-05 15:02:00) [3]
> Кщд (05.05.11 14:53) [8]
если бы это был серьезный вопрос - ответил бы, что это только идея для быстрой реализации. Почерпнутая где-то, и так же, на скорую руку, адаптированная без спец.функция какого бы ни было языка.
(дату в строку и наоборот все переводят)
Также, вероятность ошибки у идеи довольно высока, но легко поправляется ручным плюсованием константы.
fxPavel © (05.05.11 12:36) [7]
> тем более что нужно "по-быстрому"...
ничего себе, сутки - это по-быстрому? :)
Кщд (2011-05-05 14:53:00) [4]>OW © (04.05.11 17:34) [6]
>Y := '01.01.' + Copy(D,7,10);
зачем плохому учить?
fxPavel (2011-05-05 12:36:00) [5]Спасибо... но мне нужно в Firebird подсчитать...
Ну вобщем ясно.. Еще нарыл вдруг кому нужно
http://www.volny.cz/iprenosil/interbase/ip_ib_code_timestamp.htm
там есть функция как рассчитывать номер недели стандартными средствами...
На этом варианте наверное остановлюсь и я... уж очень неохота копать в приведение типов... тем более что нужно "по-быстрому"...
OW (2011-05-04 17:34:00) [6]вот,
как то надо было просто, не по ГОСТу посчитать(где на четверг смотрят)
считал так
D := DateTimeToStr(Int(now));
Y := '01.01.' + Copy(D,7,10);
week := Round((Int((StrToDate(D)-1)/7)-(Int((StrToDate(Y)-1)/7))+1));
fxPavel (2011-05-04 16:48:00) [7]ясно...
у... в какие глубины меня счас занесет...
turbouser (2011-05-04 16:47:00) [8]
> Игорь Шевченко © (04.05.11 16:41) [3]
+1
> fxPavel ©
посмотри как работают с датами, например в тут - http://rfunc.sourceforge.net/rus/
Игорь Шевченко (2011-05-04 16:41:00) [9]
> function CalcWeekNum(var ADate: TDateTime):
TDateTime - это Double. AFAIK, у даты для UDF должен быть несколько иной тип
fxPavel (2011-05-04 16:20:00) [10]э... ИЗВИНЯЮСЬ не понимаю... что верно? функция на ЛЮБУЮ дату возвращает 52.... разве 21.03.2011 это 52-я неделя??
Медвежонок Пятачок (2011-05-04 16:15:00) [11]Ну все верно.
Call WeekOf to obtain the week of the year represented by a specified TDateTime value. WeekOf returns a value between 1 and 53.