Математические операции с датой и временем
Иногда возникает необходимость проводить с датой какие-либо операции что мы и попытаемся изложить.
Для начала определимся, что у нас есть и что мы с этим можем сделать.
Операции можно проводить со следующими типами данных: DATE, TIME, TIMESTAMP
Операции которые могут нам понадобиться: это добавить(убавить) и найти разницу.
С добавлением к TIMESTAMP проще всего заниматься используя родные UDF fbudf ADDMILLISECOND(), ADDSECOND(), ADDMINUTE(), ADDDAY(), ADDWEEK, ADDMONTH(), ADDYEAR()
С версии 2.1 доступна функция dateadd.
Если не хочется использовать UDF и не важна погрешность, то можно прибавлять все ручками
для TIMESTAMP 1 (единица) это один день, соответственно 0.00001157407 это одна секунда
для DATE 1 (единица) это один день
для TIME 1 (единица) это одна секунда, 3600 это час
к примеру хотим добавить 30 секунд к TIMESTAMP
SELECT current_timestamp, current_timestamp + (0.00001157407*30) FROM RDB$DATABASE
30 секунд к TIME
select current_time, current_time + 30 from rdb$database
добавляем к дате 5 дней
select current_date , current_date + 5 from rdb$database
получить кол-во секунд с полночи можно так
select current_time - cast('0:00' as time) from rdb$database
сколько прошло времени между 18:00 и 15:30 в часах и минутах (мы тут никогда не получим результат больше суток “25:15” потому что невозможно)
select cast('0:00' as time)+(cast('18:00' as time)-cast('15:30' as time)) from rdb$database
тоже самое но с TIMESTAMP сравнивается только время, дата не учитывается никак
select cast('0:00' as time)+(cast('01.01.2001 18:00' as timestamp)-cast('02.02.2007 15:30' as timestamp))*24*60*60 from rdb$database
зато дату можно можно прибывать к другому TIMESTAMP
select cast('03.03.2003' as timestamp) + (cast('05.02.2001 18:00' as timestamp)-cast('02.02.2001 15:30' as timestamp)) from rdb$database
также мы можем TIME прибавит к TIMESTAMP
select current_timestamp+(cast('2:00' as time)-cast('0:00' as time))/(60*60*24) from rdb$database
TIME и DATE складываются без шаманства
select current_date + current_time from rdb$database
получить разницу больше суток в часах можно при помощи следующей процедуры
create or alter procedure get_my_time (beg timestamp, ends timestamp)
returns (_time varchar(20))
as
declare variable interval double precision;
declare variable hours int;
declare variable mins int;
declare variable sec int;
begin
interval = beg - ends;
if (interval < 0) then interval = -interval;
interval = interval*24;
if (cast(interval as int) > interval) then hours = interval - 1; else hours = interval;
interval = (interval - hours)*60;
if (cast(interval as int) > interval) then mins = interval - 1; else mins = interval;
sec = (interval - mins)*60;
if (sec = 60) then sec = 59; /* милисекунды могут сделать бяку, потому так */
_time = hours || ':' || case when mins>10 then mins else '0' || mins end || ':' || case when sec>10 then sec else '0' || sec end;
suspend;
end
Обсуждение