Главная страница
    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.048 c
11-1217501243
KOLBOSS
2008-07-31 14:47
2015.09.10
EnumAllKeys


15-1421098202
Юрий
2015-01-13 00:30
2015.09.10
С днем рождения ! 13 января 2015 вторник


2-1397314902
Andrey5
2014-04-12 19:01
2015.09.10
Работа с Edit


15-1412228540
alexdn
2014-10-02 09:42
2015.09.10
Что с ВКонтакте?


15-1416914908
Кто б сомневался
2014-11-25 14:28
2015.09.10
Очечи и линзы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский