Текущий архив: 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