Инструменты пользователя

Инструменты сайта


matematicheskie_operacii_s_datoj



Математические операции с датой и временем

Иногда возникает необходимость проводить с датой какие-либо операции что мы и попытаемся изложить.

Для начала определимся, что у нас есть и что мы с этим можем сделать.

Операции можно проводить со следующими типами данных: 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

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
Y T F B W
 
matematicheskie_operacii_s_datoj.txt · Последнее изменение: 2016/10/27 20:14 — aplicationp