Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
Мурад
- Сообщения: 4
- Зарегистрирован: 03 ноя 2004, 18:46
Сообщение
Мурад » 29 июн 2005, 11:46
есть в данный момент хранимая процедура тело которой следубщее:
Код: Выделить всё
begin
for
select sum (price) from ord where pat=:nank and vid=:v and dat<=:d and dat>='14.3.2005'
into result
do
begin
suspend;
end
end
в текущем виде процедура работает без проблем...
но дело том что мне нужно что то наподобие следующего:
Код: Выделить всё
begin
for
if "текущая дата">='1.7.2005' then sd :='1.7.2005' else sd :='14.3.2005' ;
select sum (price) from ord where pat=:nank and vid=:v and dat<=:d and dat>=sd
into result
do
begin
suspend;
end
end
-
Лысый
- Сообщения: 177
- Зарегистрирован: 08 ноя 2004, 08:20
Сообщение
Лысый » 29 июн 2005, 12:35
Не знаю какой у тебя сервак. Для FB 1.5:
Код: Выделить всё
FOR
SELECT SUM (PRICE)
FROM ORD
WHERE PAT=:NANK AND VID=:V AND DAT<=:D
AND DAT>=CASE WHEN (CURRENT_DATE>='1.7.2005') THEN '1.7.2005' ELSE '14.3.2005' END
INTO RESULT
DO BEGIN
SUSPEND;
END
А вообще не проще ли эту дату на клиенте определять?
-
Мурад
- Сообщения: 4
- Зарегистрирован: 03 ноя 2004, 18:46
Сообщение
Мурад » 29 июн 2005, 12:49
не хотел менять клиента... показалось что так будет проще...
сервер Ib 7.1
-
Ivan_Pisarevsky
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
Сообщение
Ivan_Pisarevsky » 29 июн 2005, 13:13
так нельзя
begin
for
if "текущая дата">='1.7.2005' then sd :='1.7.2005' else sd :='14.3.2005' ;
select sum (price) from ord where pat=:nank and vid=:v and dat<=:d and dat>=sd
into result
do
begin
suspend;
end
end
надо так
begin
if "текущая дата">='1.7.2005' then sd :='1.7.2005' else sd :='14.3.2005' ;
for
select sum (price) from ord where pat=:nank and vid=:v and dat<=:d and dat>=sd
into result
do
begin
suspend;
end
end
-
Мурад
- Сообщения: 4
- Зарегистрирован: 03 ноя 2004, 18:46
Сообщение
Мурад » 29 июн 2005, 13:36
Ivan_Pisarevsky писал(а):так нельзя
надо так
begin
if "текущая дата">='1.7.2005' then sd :='1.7.2005' else sd :='14.3.2005' ;
for
select sum (price) from ord where pat=:nank and vid=:v and dat<=:d and dat>=sd
into result
do
begin
suspend;
end
end
как получить текущую дату в Ib 7.1? CURRENT_DATE не проходит...
как надо описать sd? declare variable sd date или declare variable sd varchar(20)?
поле dat в таблице это поле типа date
-
Ivan_Pisarevsky
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
Сообщение
Ivan_Pisarevsky » 29 июн 2005, 14:05
Я не работаю с иб7, у меня фб152
select current_timestamp... у меня работает
-
Klyk
- Сообщения: 100
- Зарегистрирован: 26 окт 2004, 23:28
Сообщение
Klyk » 29 июн 2005, 23:42
CURRENT_DATE не проходит
Вот тебе на IB 7.1
Код: Выделить всё
CREATE PROCEDURE MYPROC (
PARAM2 INTEGER,
PARAM1 INTEGER)
RETURNS (
RESULT INTEGER)
AS
DECLARE VARIABLE SD TIMESTAMP;
begin
if (current_date >= '01.07.2005') then sd = '01.07.2005'; else sd = '14.03.2005';
for select sum(t.days) from MyTable t
where t.Field1 = :Param1
and
t.Field2 = :param2
into :result
do
begin
suspend;
end
end
-
SAMZ
- Сообщения: 128
- Зарегистрирован: 21 мар 2005, 08:17
Сообщение
SAMZ » 30 июн 2005, 09:41
Klyk писал(а):CURRENT_DATE не проходит
Вот тебе на IB 7.1
Код: Выделить всё
CREATE PROCEDURE MYPROC (
PARAM2 INTEGER,
PARAM1 INTEGER)
RETURNS (
RESULT INTEGER)
AS
DECLARE VARIABLE SD TIMESTAMP;
begin
if (current_date >= '01.07.2005') then sd = '01.07.2005'; else sd = '14.03.2005';
for select sum(t.days) from MyTable t
where t.Field1 = :Param1
and
t.Field2 = :param2
into :result
do
begin
suspend;
end
end
А почему нельзя использовать в качестве текущей даты 'Now'. У меня это прекрасно работает в 1.5.2 , правда в первом диалекте
-
sokol
- Сообщения: 1
- Зарегистрирован: 05 окт 2005, 12:32
Сообщение
sokol » 05 окт 2005, 17:20
А почему нельзя использовать в качестве текущей даты 'Now'. У меня это прекрасно работает в 1.5.2 , правда в первом диалекте
через 'now' и на третьем работает, но это самое 'now' нужно сначала в промежуточную переменную всунуть... Например так:
----------------------------------------------
Код: Выделить всё
CREATE PROCEDURE MYPROC (
PARAM2 INTEGER,
PARAM1 INTEGER)
RETURNS (
RESULT INTEGER)
AS
DECLARE VARIABLE SD TIMESTAMP;
DECLARE VARIABLE CD TIMESTAMP;
begin
cd = 'now';
if (cd >= '01.07.2005') then sd = '01.07.2005'; else sd = '14.03.2005';
for select sum(t.days) from MyTable t
where t.Field1 = :Param1
and
t.Field2 = :param2
into :result
do
begin
suspend;
end
end
------------------------
напрямую 'now' не так интерпретируется...