Форум: "Базы";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
Внизрасчет номера недели в FB через UDF Найти похожие ветки
← →
fxPavel © (2011-05-04 15:51) [0]Необходимо в БД 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...
Подскажите пожта, куда рыть....
← →
Медвежонок Пятачок © (2011-05-04 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.
← →
fxPavel © (2011-05-04 16:20) [2]э... ИЗВИНЯЮСЬ не понимаю... что верно? функция на ЛЮБУЮ дату возвращает 52.... разве 21.03.2011 это 52-я неделя??
← →
Игорь Шевченко © (2011-05-04 16:41) [3]
> function CalcWeekNum(var ADate: TDateTime):
TDateTime - это Double. AFAIK, у даты для UDF должен быть несколько иной тип
← →
turbouser © (2011-05-04 16:47) [4]
> Игорь Шевченко © (04.05.11 16:41) [3]
+1
> fxPavel ©
посмотри как работают с датами, например в тут - http://rfunc.sourceforge.net/rus/
← →
fxPavel © (2011-05-04 16:48) [5]ясно...
у... в какие глубины меня счас занесет...
← →
OW © (2011-05-04 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));
← →
fxPavel © (2011-05-05 12:36) [7]Спасибо... но мне нужно в Firebird подсчитать...
Ну вобщем ясно.. Еще нарыл вдруг кому нужно
http://www.volny.cz/iprenosil/interbase/ip_ib_code_timestamp.htm
там есть функция как рассчитывать номер недели стандартными средствами...
На этом варианте наверное остановлюсь и я... уж очень неохота копать в приведение типов... тем более что нужно "по-быстрому"...
← →
Кщд (2011-05-05 14:53) [8]>OW © (04.05.11 17:34) [6]
>Y := "01.01." + Copy(D,7,10);
зачем плохому учить?
← →
OW © (2011-05-05 15:02) [9]
> Кщд (05.05.11 14:53) [8]
если бы это был серьезный вопрос - ответил бы, что это только идея для быстрой реализации. Почерпнутая где-то, и так же, на скорую руку, адаптированная без спец.функция какого бы ни было языка.
(дату в строку и наоборот все переводят)
Также, вероятность ошибки у идеи довольно высока, но легко поправляется ручным плюсованием константы.
fxPavel © (05.05.11 12:36) [7]
> тем более что нужно "по-быстрому"...
ничего себе, сутки - это по-быстрому? :)
← →
Кщд (2011-05-05 15:34) [10]>OW © (05.05.11 15:02) [9]
Также, вероятность ошибки у идеи довольно высока, но легко поправляется ручным плюсованием константы.
речь шла о локали)
← →
PEAKTOP © (2011-05-06 11:11) [11]> 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
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.048 c