Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.042 c
15-1418938202
Юрий
2014-12-19 00:30
2015.09.10
С днем рождения ! 19 декабря 2014 пятница


15-1418199716
Юрий Зотов
2014-12-10 11:21
2015.09.10
Концерт


11-1252401951
Ruzzz
2009-09-08 13:25
2015.09.10
Немного переделал MHXP Компонент


15-1410753233
oldman
2014-09-15 07:53
2015.09.10
Нужна помощь. Мне.


15-1418746443
Erracado
2014-12-16 19:14
2015.09.10
Прерывание выполнения ADOQuery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский