Capítulo 5. Tipos temporales: Operaciones genéricas (Parte 1)

Tabla de contenidos

Introducción
Entrada y salida
Constructores
Conversión de tipos
Accesores
Transformaciones

Introducción

A continuación presentamos las funciones y operadores para tipos temporales. Estas funciones y operadores son polimórficos, es decir, sus argumentos pueden ser de varios tipos y el tipo del resultado puede depender del tipo de los argumentos. Para expresar esto, usamos la siguiente notación:

  • time representa cualquier tipo de tiempo, es decir, timestamptz, tstzspan, tstzset o tstzspanset,

  • ttype representa cualquier tipo temporal,

  • tdisc representa cualquier tipo temporal con tipo de base discreto, es decir, tbool, tint o ttext,

  • tcont representa cualquier tipo temporal con tipo de base continuo, es decir, tfloat, tgeompoint o tgeogpoint,

  • torder representa cualquier tipo temporal cuyo tipo de base tiene definido un orden total, es decir, tint, tfloat o ttext,

  • talpha representa cualquier tipo temporal alfanumérico, por ejemplo, tint or ttext,

  • tnumber representa cualquier tipo de número temporal, es decir, tint o tfloat,

  • tpoint representa un tipo de punto temporal, es decir, tgeompoint o tgeogpoint,

  • ttypeInst representa cualquier tipo temporal con subtipo instante,

  • ttypeDiscSeq representa cualquier tipo temporal con subtipo secuencia e interpolación discreta,

  • ttypeContSeq representa cualquier tipo temporal con subtipo secuencia e interpolación contínua,

  • ttypeSeqSet representa cualquier tipo temporal con subtipo conjunto de secuencias

  • base representa cualquier tipo de base de un tipo temporal, es decir, boolean, integer, float, text, geometry o geography,

  • values representa cualquier conjunto de valores de un tipo base de un tipo temporal, por ejemplo, integer, intset, intspan y intspanset para el tipo base integer

  • number representa cualquier tipo de base numérico, es decir, integer o float,

  • numspan representa cualquier tipo de rango numérico, es decir, intspan o floatspan,

  • geo representa los tipos geometry o geography,

  • geompoint representa el tipo geometry restringido a un punto.

  • point representa los tipos geometry o geography restringidos a un punto.

  • lines representa los tipos geometry o geography restringidos a una (multi)línea.

  • type[] representa una matriz de type.

  • <type> en el nombre de una función representa las funciones obtenidas al remplazar <type> por un type específico. Por ejemplo, tintDiscSeq o tfloatDiscSeq son representadas por ttypeDiscSeq.

Una forma común de generalizar las operaciones tradicionales a los tipos temporales es aplicar la operación en cada instante, lo que da un valor temporal como resultado. En ese caso, la operación sólo se define en la intersección de las extensiones temporales de los operandos; si las extensiones temporales son disjuntas, el resultado es nulo. Por ejemplo, los operadores de comparación temporal, como #<, determinan si los valores tomados por sus operandos en cada instante satisfacen la condición y devuelven un booleano temporal. A continuación se dan ejemplos de las diversas generalizaciones de los operadores.

-- Comparación temporal
SELECT tfloat '[2@2001-01-01, 2@2001-01-03)' #< tfloat '[1@2001-01-01, 3@2001-01-03)';
-- {[f@2001-01-01, f@2001-01-02], (t@2001-01-02, t@2001-01-03)}
SELECT tfloat '[1@2001-01-01, 3@2001-01-03)' #< tfloat '[3@2001-01-03, 1@2001-01-05)';
-- NULL

-- Adición temporal
SELECT tint '[1@2001-01-01, 1@2001-01-03)' + tint '[2@2001-01-02, 2@2001-01-05)';
-- [3@2001-01-02, 3@2001-01-03)

-- Intersección temporal
SELECT tintersects(tgeompoint '[Point(0 1)@2001-01-01, Point(3 1)@2001-01-04)',
geometry 'Polygon((1 0,1 2,2 2,2 0,1 0))');
-- {[f@2001-01-01, t@2001-01-02, t@2001-01-03], (f@2001-01-03, f@2001-01-04]}

-- Distancia temporal
SELECT tgeompoint '[Point(0 0)@2001-01-01 08:00:00, Point(0 1)@2001-01-03 08:10:00)' <->
tgeompoint '[Point(0 0)@2001-01-02 08:05:00, Point(1 1)@2001-01-05 08:15:00)';
-- [0.5@2001-01-02 08:05:00+00, 0.745184033794557@2001-01-03 08:10:00+00)

Otro requisito común es determinar si los operandos satisfacen alguna vez o siempre una condición con respecto a una operación. Estos se pueden obtener aplicando los operadores de comparación alguna vez o siempre. Estos operadores se indican anteponiendo los operadores de comparación tradicionales con, respectivamente, ? (alguna vez) y % (siempre). A continuación se dan ejemplos de operadores de comparación alguna vez y siempre.

-- ¿Se cruzan los operandos alguna vez?
SELECT eIntersects(tgeompoint '[Point(0 1)@2001-01-01, Point(3 1)@2001-01-04)',
  geometry 'Polygon((1 0,1 2,2 2,2 0,1 0))') ?= true;
-- true

-- ¿Se cruzan los operandos siempre?
SELECT aIntersects(tgeompoint '[Point(0 1)@2001-01-01, Point(3 1)@2001-01-04)',
  geometry 'Polygon((0 0,0 2,4 2,4 0,0 0))') %= true;
-- true

-- ¿Es el operando izquierdo alguna vez menor que el derecho?
SELECT (tfloat '[1@2001-01-01, 3@2001-01-03)' ?<
  tfloat '[3@2001-01-01, 1@2001-01-03)') ?= true;
-- true

-- ¿Es el operando izquierdo siempre menor que el derecho?
SELECT (tfloat '[1@2001-01-01, 3@2001-01-03)' %<
  tfloat '[2@2001-01-01, 4@2001-01-03)') %= true;
-- true

Por ejemplo, la función eIntersects determina si hay un instante en el que los dos argumentos se cruzan espacialmente.

A continuación describimos las funciones y operadores para tipos temporales. Para mayor concisión, en los ejemplos usamos principalmente secuencias compuestas por dos instantes.