-
Необходимо в БД 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...
Подскажите пожта, куда рыть.... -
Медвежонок Пятачок © (04.05.11 16:15) [1]Ну все верно.
Call WeekOf to obtain the week of the year represented by a specified TDateTime value. WeekOf returns a value between 1 and 53. -
э... ИЗВИНЯЮСЬ не понимаю... что верно? функция на ЛЮБУЮ дату возвращает 52.... разве 21.03.2011 это 52-я неделя??
-
Игорь Шевченко © (04.05.11 16:41) [3]
> function CalcWeekNum(var ADate: TDateTime):
TDateTime - это Double. AFAIK, у даты для UDF должен быть несколько иной тип -
turbouser © (04.05.11 16:47) [4]
> Игорь Шевченко © (04.05.11 16:41) [3]
+1
> fxPavel ©
посмотри как работают с датами, например в тут - http://rfunc.sourceforge.net/rus/ -
ясно...
у... в какие глубины меня счас занесет... -
OW © (04.05.11 17:34) [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)); -
Спасибо... но мне нужно в Firebird подсчитать...
Ну вобщем ясно.. Еще нарыл вдруг кому нужно
http://www.volny.cz/iprenosil/interbase/ip_ib_code_timestamp.htm
там есть функция как рассчитывать номер недели стандартными средствами...
На этом варианте наверное остановлюсь и я... уж очень неохота копать в приведение типов... тем более что нужно "по-быстрому"... -
Кщд (05.05.11 14:53) [8]>OW © (04.05.11 17:34) [6]
>Y := '01.01.' + Copy(D,7,10);
зачем плохому учить? -
OW © (05.05.11 15:02) [9]
> Кщд (05.05.11 14:53) [8]
если бы это был серьезный вопрос - ответил бы, что это только идея для быстрой реализации. Почерпнутая где-то, и так же, на скорую руку, адаптированная без спец.функция какого бы ни было языка.
(дату в строку и наоборот все переводят)
Также, вероятность ошибки у идеи довольно высока, но легко поправляется ручным плюсованием константы.
fxPavel © (05.05.11 12:36) [7]
> тем более что нужно "по-быстрому"...
ничего себе, сутки - это по-быстрому? :) -
Кщд (05.05.11 15:34) [10]>OW © (05.05.11 15:02) [9]
Также, вероятность ошибки у идеи довольно высока, но легко поправляется ручным плюсованием константы.
речь шла о локали) -
> 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