Конференция "Базы" » расчет номера недели в FB через UDF [IB6.x]
 
  • fxPavel © (04.05.11 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...

    Подскажите пожта, куда рыть....
  • Медвежонок Пятачок © (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.
  • fxPavel © (04.05.11 16:20) [2]
    э... ИЗВИНЯЮСЬ не понимаю... что верно? функция на ЛЮБУЮ дату возвращает 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/
  • fxPavel © (04.05.11 16:48) [5]
    ясно...
    у... в какие глубины меня счас занесет...
  • 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));
  • fxPavel © (05.05.11 12:36) [7]
    Спасибо... но мне нужно в 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]
    Также, вероятность ошибки у идеи довольно высока, но легко поправляется ручным плюсованием константы.

    речь шла о локали)
  • PEAKTOP © (06.05.11 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

 
Конференция "Базы" » расчет номера недели в FB через UDF [IB6.x]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]