Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Помогите с довольно простой ХП


Автор: scorp 15.12.2002, 10:49
Ниже процедура, которая отбирает людей старше 60 лет и ещё не уволенных.
все поля дат у меня имеют тип Timestamp


SET TERM ^;
CREATE PROCEDURE old_drivers
AS
Declare variable driverID integer;
Declare variable DateTime Date;
  BEGIN
  DateTime = cast('now' as Date);
  For Select ID
      From tbDrivers
      where (:DateTime - tbDrivers.birthday)>60 and tbDrivers.date_dismissal is null
      Into :driverID
   do
    begin
     Update tbDrivers set tbDrivers.date_dismissal=:DateTime where tbDrivers.ID=:driverID;
     suspend;
    end
 END^
SET TERM ;^

Автор: Vit 15.12.2002, 14:04
1) Нет вопроса
2) Нет указания на то что именно не работает
3) Нет указания на то какая это база данных, так как даты в разных базах организованы немного по разному.

Автор: Medved 15.12.2002, 17:00
Процедура скорее всего на Interbase.... но что-то и мне не совсем понятно, в чем у тебя проблема....

Автор: podval 15.12.2002, 18:21
Предполагаю, что строка
Цитата
where (:DateTime - tbDrivers.birthday)>60
выделена жирным шрифтом неспроста :)


Автор: Medved 15.12.2002, 18:50
Цитата

выделена жирным шрифтом неспроста  


Это еще ни о чем не говорит.....


Автор: scorp 18.12.2002, 03:59
Сорри, если не корректно задал вопрос.
Это хранимая процедура под InterBase. весь вопрос состоит в том, что не работает выражение, выделенное жирным шрифтом.
 Это выражение слегка изменилось в моей последней редакции:

where (:DateTime - cast (tbDrivers.birthday as Date))>60 and tbDrivers.date_dismissal is null

Я не получаю целого числа перед сравнением с чимслом 60.

все поля с датами в базе имеют тип TimeStamp. Процедура отбирает всех сотрудников старше 60 лет и ещё не уволенных и отправляет их на пенсию.
Как его переделать?

Автор: scorp 18.12.2002, 04:18
Всё народ сделал.
надо было так:
where ((cast (tbDrivers.birthday as date) + 21915)< :DateTime) and (tbDrivers.date_dismissal is null)

где 21915 - кол-во дней за 60 лет с учётом вытокостных лет, с погрешностью в один, два дня.

а до этого я прибавлял всего 60 дней.

Кто помогал, тому сенкс

Автор: Medved 18.12.2002, 04:44
вообще-то тебе никто и не помогал если честно....


Автор: digital_pilot 19.12.2002, 09:01
что, неужели в interbase нету ниче вроде DATEDIFF в mssql? просветите, чисто для общего развития :)

Автор: AntonSaburov 19.12.2002, 21:19
Цитата(digital_pilot @ 19.12.2002, 01:01)
что, неужели в interbase нету ниче вроде DATEDIFF в mssql? просветите, чисто для общего развития :)

Модератор: Желательно задавать этот вопрос в отдельной теме

Автор: Vit 20.12.2002, 00:48
Цитата(AntonSaburov @ 19.12.2002, 04:19)
Цитата(digital_pilot @ 19.12.2002, )
что, неужели в interbase нету ниче вроде DATEDIFF в mssql? просветите, чисто для общего развития :)

Модератор: Желательно задавать этот вопрос в отдельной теме

Это как раз вопрос по теме, тут действительно - если есть функция сравнения дат то решение нужно делать через неё, так как предложенное решение мягко выражаясь очень приблизительное.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)