Математические операции с датой и временем
Иногда возникает необходимость проводить с датой какие-либо операции что мы и попытаемся изложить.
Для начала определимся, что у нас есть и что мы с этим можем сделать.
Операции можно проводить со следующими типами данных: 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
Обсуждение