Adición, resta, multiplicación y división temporal
{number,tnumber} {+, -, *, /} {number,tnumber} → tnumber
La división temporal genera un error si el denominador es alguna vez igual a cero durante el intervalo de tiempo común de los argumentos.
El producto de dos flotantes temporales con interpolación lineal es, entre dos instantes consecutivos, un polinomio de grado dos en el tiempo, y el cociente por un flotante temporal con interpolación lineal es una razón de dos funciones lineales, ninguno de los cuales puede expresar la interpolación lineal. El resultado contiene entonces el valor en los instantes de los argumentos y, dentro de un segmento, en el extremo del producto y en un instante adicional de un cociente de dos flotantes temporales, y es lineal entre los instantes que contiene. Cada valor que contiene el resultado es exacto, y también lo son su mínimo y su máximo, ya que un cociente varía de forma monótona entre dos instantes, pero entre los instantes que contiene el resultado es la cuerda del producto o del cociente. En los ejemplos siguientes, el producto vale 3.75 al mediodía del 1 de enero, donde el resultado interpola 3.5, y 2 dividido por el flotante temporal vale 1 al mediodía del 2 de enero, donde el resultado interpola 1.333. El producto de un flotante temporal por un número o por un flotante temporal con interpolación escalonada, y su cociente por un número o por un flotante temporal con interpolación escalonada, son lineales entre dos instantes y son exactos.
SELECT tint '[2@2001-01-01, 2@2001-01-04)' + 1;
-- [3@2001-01-01, 3@2001-01-04)
SELECT tfloat '[2@2001-01-01, 2@2001-01-04)' + tfloat '[1@2001-01-01, 4@2001-01-04)';
-- [3@2001-01-01, 6@2001-01-04)
SELECT tfloat '[1@2001-01-01, 4@2001-01-04)' + tfloat '{[1@2001-01-01, 2@2001-01-02),
[1@2001-01-02, 2@2001-01-04)}';
-- {[2@2001-01-01, 4@2001-01-04), [3@2001-01-02, 6@2001-01-04)}
SELECT tint '[1@2001-01-01, 1@2001-01-04)' - tint '[2@2001-01-03, 2@2001-01-05)'; -- [-1@2001-01-03, -1@2001-01-04) SELECT tfloat '[3@2001-01-01, 6@2001-01-04)' - tfloat '[2@2001-01-01, 2@2001-01-04)'; -- [1@2001-01-01, 4@2001-01-04)
SELECT tint '[1@2001-01-01, 4@2001-01-04]' * 2; -- [2@2001-01-01, 8@2001-01-04] SELECT tfloat '[1@2001-01-01, 4@2001-01-04)' * tfloat '[2@2001-01-01, 2@2001-01-04)'; -- [2@2001-01-01, 8@2001-01-04) SELECT tfloat '[1@2001-01-01, 3@2001-01-03)' * '[3@2001-01-01, 1@2001-01-03)'; -- [3@2001-01-01, 4@2001-01-02, 3@2001-01-03) SELECT valueAtTimestamp(tfloat '[1@2001-01-01, 3@2001-01-03)' * '[3@2001-01-01, 1@2001-01-03)', '2001-01-01 12:00'); -- 3.5
SELECT 2 / tfloat '[1@2001-01-01, 3@2001-01-04)'; -- [2@2001-01-01, 0.666666666666667@2001-01-04) SELECT valueAtTimestamp(2 / tfloat '[1@2001-01-01, 3@2001-01-04)', '2001-01-02 12:00'); -- 1.3333333333333333 SELECT tfloat '[1@2001-01-01, 5@2001-01-05)' / tfloat '[5@2001-01-01, 1@2001-01-05)'; -- [0.2@2001-01-01, 1@2001-01-03, 5@2001-01-05) SELECT 2 / tfloat '[-1@2001-01-01, 1@2001-01-02]'; -- ERROR: Division by zero SELECT tfloat '[-1@2001-01-04, 1@2001-01-05]' / tfloat '[-1@2001-01-01, 1@2001-01-05]'; -- [-2@2001-01-04, 1@2001-01-05]
Devuelve el valor absoluto del número temporal
abs(tnumber) → tnumber
SELECT abs(tfloat '[1@2001-01-01, -1@2001-01-03, 1@2001-01-05]'); -- [1@2001-01-01, 0@2001-01-02, 1@2001-01-03, 0@2001-01-04, 1@2001-01-05] SELECT abs(tint '[1@2001-01-01, -1@2001-01-03, 1@2001-01-05]'); -- [1@2001-01-01, 1@2001-01-05]
Redondea al entero inferior o superior
floor(tfloat) → tfloat ceil(tfloat) → tfloat
SELECT floor(tfloat '[0.5@2001-01-01, 1.5@2001-01-02]'); -- [0@2001-01-01, 1@2001-01-02] SELECT ceil(tfloat '[0.5@2001-01-01, 0.6@2001-01-02, 0.7@2001-01-03]'); -- [1@2001-01-01, 1@2001-01-03]
Redondea a un número de posiciones decimales
round(tfloat,integer=0) → tfloat
SELECT round(tfloat '[0.785398163397448@2001-01-01, 2.356194490192345@2001-01-02]', 2); -- [0.79@2001-01-01, 2.36@2001-01-02]
Convierte a grados o radianes
degrees({float,tfloat},normalize boolean=false) → tfloat
radians(tfloat) → tfloat
El parámetro adicional en la función degrees puede ser utilizado para normalizar los valores entre 0 y 360 grados.
SELECT degrees(pi() * 5); -- 900 SELECT degrees(pi() * 5, true); -- 180 SELECT round(degrees(tfloat '[0.785398163397448@2001-01-01, 2.356194490192345@2001-01-02]')); -- [45@2001-01-01, 135@2001-01-02] SELECT radians(tfloat '[45@2001-01-01, 135@2001-01-02]'); -- [0.785398163397448@2001-01-01, 2.356194490192345@2001-01-02]
Devuelve la diferencia de valor entre instantes consectivos del número temporal
deltaValue(tnumber) → tnumber
SELECT deltaValue(tint '[1@2001-01-01, 2@2001-01-02, 1@2001-01-03]');
-- [1@2001-01-01, -1@2001-01-02, -1@2001-01-03)
SELECT deltaValue(tfloat '{[1.5@2001-01-01, 2@2001-01-02, 1@2001-01-03],
[2@2001-01-04, 2@2001-01-05]}');
/* Interp=Step;{[0.5@2001-01-01, -1@2001-01-02, -1@2001-01-03),
[0@2001-01-04, 0@2001-01-05)} */
Devuelve la tendencia de un flotante temporal con interpolación lineal, que indica si su valor es creciente, constante o decreciente, representado, respectivamente, por 1, 0 y -1
trend(tfloat) → tint
Nótese que la tendencia es NULL para secuencias instantáneas.
SELECT trend(tfloat '[1@2001-01-01, 2@2001-01-02, 4@2001-01-03, 4@2001-01-04, 3@2001-01-05, 2@2001-01-06]'); -- [1@2001-01-01, 0@2001-01-03, -1@2001-01-04, -1@2001-01-06] SELECT trend(tfloat '[1@2001-01-01]'); -- NULL
Devuelve la derivada sobre el tiempo del número flotante temporal en unidades por segundo
derivative(tfloat) → tfloat
El número flotante temporal debe tener interpolación linear. Nótese que esta función corresponde a la función speed para los puntos temporales.
SELECT derivative(tfloat '{[0@2001-01-01, 10@2001-01-02, 5@2001-01-03],
[1@2001-01-04, 0@2001-01-05]}') * 3600 * 24;
/* Interp=Step;{[-10@2001-01-01, 5@2001-01-02, 5@2001-01-03],
[1@2001-01-04, 1@2001-01-05]} */
SELECT derivative(tfloat 'Interp=Step;[0@2001-01-01, 10@2001-01-02, 5@2001-01-03]');
-- ERROR: The temporal value must have linear interpolation
Devuelve el área bajo la curva
integral(tnumber) → float
SELECT integral(tint '[1@2001-01-01,2@2001-01-02]') / (24 * 3600 * 1e6); -- 1 SELECT integral(tfloat '[1@2001-01-01,2@2001-01-02]') / (24 * 3600 * 1e6); -- 1.5
Devuelve el promedio ponderado en el tiempo
twAvg(tnumber) → float
SELECT twAvg(tfloat '{[1@2001-01-01, 2@2001-01-03), [2@2001-01-04, 2@2001-01-06)}');
-- 1.75
Devuelve el logaritmo natural y el logaritmo base 10 de un número flotante temporal
ln(tfloat) → tfloat log10(tfloat) → tfloat
El número flotante temporal no puede ser cero o negativo. Con interpolación lineal, el resultado tiene, en cada segmento, los instantes del segmento y el instante en el que la interpolación lineal más se aleja del logaritmo, y se interpola linealmente entre ellos
SELECT ln(tfloat '{[1@2001-01-01, 10@2001-01-02, 5@2001-01-03],
[1@2001-01-04, 1@2001-01-05]}');
/* {[0@2001-01-01, 1.363192132076512@2001-01-01 07:45:23.043236,
2.302585092994046@2001-01-02, 1.975950833017318@2001-01-02 13:22:31.148467,
1.6094379124341@2001-01-03], [0@2001-01-04, 0@2001-01-05]} */
SELECT log10(tfloat 'Interp=Step;[-10@2001-01-01, 10@2001-01-02]');
-- ERROR: Cannot take logarithm of zero or a negative number
Devuelve el exponencial (e elevado a la potencia dada) de un número flotante temporal
exp(tfloat) → tfloat
Con interpolación lineal, el resultado tiene, en cada segmento, los instantes del segmento y el instante en el que la interpolación lineal más se aleja de la exponencial, y se interpola linealmente entre ellos
SELECT exp(tfloat '{[1@2001-01-01, 10@2001-01-02], [1@2001-01-04, 1@2001-01-05]}');
/* {[2.718281828459045@2001-01-01, 2447.0830569101154@2001-01-01 18:08:25.45925,
22026.465794806718@2001-01-02],
[2.718281828459045@2001-01-04, 2.718281828459045@2001-01-05]} */
SELECT exp(tfloat '{-10@2001-01-01, 0@2001-01-02, 10@2001-01-03}');
-- {0.000045399929762@2001-01-01, 1@2001-01-02, 22026.465794806718@2001-01-03}
Devuelve el seno, coseno o tangente de un número flotante temporal (argumento en radianes)
sin(tfloat) → tfloat cos(tfloat) → tfloat tan(tfloat) → tfloat
Con interpolación lineal, el resultado de sin y cos tiene, en cada segmento, los instantes del segmento y los de los extremos de la función, el resultado de tan se refina por bisección donde la función es empinada, y el resultado se interpola linealmente entre sus instantes. El número flotante temporal de tan no puede alcanzar π/2 más un múltiplo de π, en un instante o a lo largo de un segmento con interpolación lineal
SELECT round(sin(tfloat '[0@2001-01-01, 6.283185307@2001-01-02]'), 6);
-- [0@2001-01-01, 1@2001-01-01 06:00:00.000001, -1@2001-01-01 18:00:00.000002, 0@2001-01-02]
SELECT round(cos(tfloat '[0@2001-01-01, 3.141592654@2001-01-02]'), 6);
-- [1@2001-01-01, -1@2001-01-02]
SELECT round(tan(tfloat '{0@2001-01-01, 0.785398163@2001-01-02}'), 6);
-- {0@2001-01-01, 1@2001-01-02}
SELECT tan(tfloat '[0@2001-01-01, 3@2001-01-02]');
-- ERROR: Cannot take the tangent of pi/2 plus a multiple of pi