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

Вниз

Даты в хранимых процедурах (FireBird 1.5)   Найти похожие ветки 

 
Slider007 ©   (2007-06-04 06:44) [0]

Ребята есть у меня 3 переменных - d,m,y (день, месяц, год) типа integer.
Вопрос в следующим - как можно из них переменную типа Date состряпать внутри хранимой процедуры ? По сути нужно то, что делает EncodeDate в Делфи. Или UDF свой писать придется ?


 
Сергей М. ©   (2007-06-04 08:19) [1]


> есть у меня 3 переменных


Где эти переменные объявлены ?


 
Slider007 ©   (2007-06-04 08:50) [2]

Ну допустим так (упростил):

SET TERM ^ ;

CREATE PROCEDURE CALC_DATE (
   d integer,
   m integer,
   y integer)
returns (
   dt date)
as
begin

 dt = ...

 suspend;
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE CALC_DATE TO SYSDBA;


 
Сергей М. ©   (2007-06-04 08:54) [3]

И эта процедура, надо понимать, вызывается клиентом ?
Тогда почему клиенту сразу не передать дату одним готовым параметром типа DATE ?


 
Johnmen ©   (2007-06-04 09:09) [4]

CAST( d||"."||m||"."||y AS DATE)


 
Slider007 ©   (2007-06-04 09:30) [5]

Нее, на самом деле я тут упростил совсем.
Задача такая:
Вносится запись (документ) в таблицу. Вносится процедурой. В процедуру передаются только значения полей. В одном из полей содержится дата, например 12.06.2007. В этой же процедуре после внесения документа считается статистика своеобразная по документам из таблицы за месяц, т.е. мне надо из даты 12.06.2007 получить две даты - 01.06.2007 и 30.06.2007 - начало и конец месяца, чтобы по ним потом делать нужный запрос.

Вот. На сайте ibase.ru скачал библиотеку udf, с помощью которой разодрал дату на d,m,y. Только толку мало от этого, т.к. как обратно в кучу собрать не знаю, а скачаная мной библиотека этого не умеет.

Можно конечно в процедуру сразу передавать и начало и конец месяца вместе с самой датой документа, но это ж изврат по моему.

А может быть средствами SQLя можно сделать запрос по текущему месяцу (выбрать записи из таблицы с 01.06.2007 по 30.06.2007) имея только одну дату, например 12.06.2007 ?


 
Slider007 ©   (2007-06-04 09:31) [6]

Johnmen ©   (04.06.07 9:09) [4]
Ага, спасибо, кажется то что нужно. Буду пробовать.


 
Deniz ©   (2007-06-04 10:25) [7]


> На сайте ibase.ru скачал библиотеку udf, с помощью которой разодрал дату на d,m,y.

Так есть же extract в FireBird 1.5, т.е.:
Extract(day/month/year from DateTimeField)


 
Desdechado ©   (2007-06-04 10:59) [8]

Johnmen ©   (04.06.07 09:09) [4]
Лучше в обратном порядке и через дефис.

Хотя я бы предпочел вычислять первый и последний день месяца из переданной нормальной даты.


 
Slider007 ©   (2007-06-04 11:12) [9]

Desdechado ©   (04.06.07 10:59) [8]
Хотя я бы предпочел вычислять первый и последний день месяца из переданной нормальной даты.


КАК ??? О:)


 
Slider007 ©   (2007-06-04 11:18) [10]

Пишу:
SET TERM ^ ;

CREATE PROCEDURE CALC_DATE
returns (
   dt integer)
as
declare variable d integer;
declare variable m integer;
declare variable y integer;
begin

 d = 05;
 m = 08;
 y = 2007;

 dt = CAST( y||"-"||m||"-"||d AS DATE);
 /*или dt = CAST( d||"."||m||"."||y AS DATE);*/

 suspend;
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE CALC_DATE TO SYSDBA;


Отвечает:
Overflow occurred during data type conversion.
conversion error from string "2007-08-05"

Где грабли притаились ?


 
Slider007 ©   (2007-06-04 11:18) [11]

Slider007 ©   (04.06.07 11:18) [10]
Пишу ессесно:
SELECT dt from CALC_DATE


 
Johnmen ©   (2007-06-04 11:29) [12]

Какая ошибка на CAST( d||"."||m||"."||y AS DATE)?


 
Slider007 ©   (2007-06-04 11:35) [13]

Johnmen ©   (04.06.07 11:29) [12]
Какая ошибка на CAST( d||"."||m||"."||y AS DATE)?


Error Message:
----------------------------------------
Overflow occurred during data type conversion.
conversion error from string "2007-08-05".

Выполняю в IBExpert


 
sniknik ©   (2007-06-04 11:43) [14]

> conversion error from string "2007-08-05".
это ошибка на
> dt = CAST( y||"-"||m||"-"||d AS DATE);
строка "2007-08-05" ну никак не может получится из обьеденения d||"."||m||"."||y


 
stud ©   (2007-06-04 11:44) [15]

а нафига первый и последний день??? есть же месяц и год.
и все, что еще надо чтобы получить данные за месяц??


 
Slider007 ©   (2007-06-04 11:51) [16]

sniknik ©   (04.06.07 11:43) [14]
строка "2007-08-05" ну никак не может получится из обьеденения d||"."||m||"."||y


Тем не менее получается.
dt = CAST( y||"-"||m||"-"||d AS DATE);
и
dt = CAST( d||"."||m||"."||y AS DATE);
дают одну и ту же ошибку.


 
Slider007 ©   (2007-06-04 11:52) [17]

stud ©   (04.06.07 11:44) [15]
Подскажи пожалуйста как условие where написать если есть дата из месяца, чтоб охватить весь месяц ?


 
sniknik ©   (2007-06-04 11:56) [18]

> дают одну и ту же ошибку.
попробуй подставь явно

CAST("2007-08-05" AS DATE);
CAST("2007/08/05" AS DATE);
CAST("2007.08.05" AS DATE);
CAST("05/08/2007" AS DATE);
CAST("05.08.2007" AS DATE);
и т.д.

везде  ошибки? одинаковые?


 
sniknik ©   (2007-06-04 12:00) [19]

> returns (
>   dt integer)

> dt = CAST( y||"-"||m||"-"||d AS DATE);


 
Slider007 ©   (2007-06-04 12:09) [20]

sniknik ©   (04.06.07 11:56) [18]
Ничего не понимаю, толи у меня глюк был, толи база глюкнула, толи IBExpert. Удалил старую процедуру [10].
Написал заново ТО ЖЕ САМОЕ. Всё заработало.
Спасибо большое за помощь.


 
Desdechado ©   (2007-06-04 12:16) [21]

Slider007 ©   (04.06.07 11:12) [9]
Через UDF. Или PSQL (навскидку) циклом WHILE. Вычитать (прибавлять) по одному дню, пока месяц не изменится. Почему циклом? Чтоб проблему перехода через 1 января решить и не заниматься конструированием из строк (слишком формато-зависимое).


 
stud ©   (2007-06-04 12:18) [22]

Slider007 ©   (04.06.07 11:52) [17]
Подскажи пожалуйста как условие where написать если есть дата из месяца, чтоб охватить весь месяц ?

where extract(month,data_field)=m and extract(yaer,data_field)=y


 
Slider007 ©   (2007-06-04 12:23) [23]

sniknik ©   (04.06.07 11:56) [18]
Desdechado ©   (04.06.07 12:16) [21]
stud ©   (04.06.07 12:18) [22]

Ещё раз всем спасибо :)


 
Slider007 ©   (2007-06-04 12:23) [24]

И тем кого не указал тож спасибо ;)


 
sniknik ©   (2007-06-04 12:38) [25]

> Написал заново ТО ЖЕ САМОЕ. Всё заработало.
это тебе так кажется что тоже самое... ты даже тут приводишь куски одной и той же процедуры и в одной версии параметр дата в другой целое...



Страницы: 1 вся ветка

Текущий архив: 2007.10.07;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.025 c
1-1185554019
Ice-T
2007-07-27 20:33
2007.10.07
Беда OPenDialog а


9-1161426272
maxim-13
2006-10-21 14:24
2007.10.07
SOS


15-1189094106
Ezorcist
2007-09-06 19:55
2007.10.07
portable delphi?


15-1189275380
OlegZp
2007-09-08 22:16
2007.10.07
Помогите восстановить Internet Explorer


2-1189256260
МаксПла
2007-09-08 16:57
2007.10.07
Откат в сохранении настроек