Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

расчет номера недели в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.137 c
2-1398332811
FIL-23
2014-04-24 13:46
2015.09.10
ShellExecute в XE5 не компилится


2-1396405670
Drowsy
2014-04-02 06:27
2015.09.10
TDUPM


15-1415815791
alexdn
2014-11-12 21:09
2015.09.10
Вопрос по wordpress


2-1396061819
SKIPtr
2014-03-29 06:56
2015.09.10
определить выход из спящего режима


15-1415727540
Rouse_
2014-11-11 20:39
2015.09.10
Просто для информации :)