Un valor temporal se puede transformar en otro subtipo. Se genera un error si los subtipos son incompatibles.
Transformar un tipo temporal a otro subtipo
ttypeInst(ttype) → ttypeInst
ttypeSeq(ttype) → ttypeSeq
ttypeSeqSet(ttype) → ttypeSeqSet
SELECT tboolInst(tbool '{[true@2001-01-01]}'); -- t@2001-01-01 SELECT tboolInst(tbool '{[true@2001-01-01, true@2001-01-02]}'); -- ERROR: Cannot transform input value to a temporal instant SELECT tintSeq(tint '1@2001-01-01'); -- [1@2001-01-01] SELECT tfloatSeqSet(tfloat '2.5@2001-01-01'); -- {[2.5@2001-01-01]} SELECT tfloatSeqSet(tfloat '{2.5@2001-01-01, 1.5@2001-01-02, 3.5@2001-01-03}'); -- {[2.5@2001-01-01],[1.5@2001-01-02],[3.5@2001-01-03]}
Transformar un valor temporal a otra interpolación
setInterp(ttype, interp) → ttype
SELECT setInterp(tbool 'true@2001-01-01','discrete'); -- {t@2001-01-01} SELECT setInterp(tfloat '{[1@2001-01-01], [2@2001-01-02], [1@2001-01-03]}', 'discrete'); -- {1@2001-01-01, 2@2001-01-02, 1@2001-01-03} SELECT setInterp(tfloat 'Interp=Step;[1@2001-01-01, 2@2001-01-02, 1@2001-01-03, 2@2001-01-04]', 'linear'); /* {[1@2001-01-01, 1@2001-01-02), [2@2001-01-02, 2@2001-01-03), [1@2001-01-03, 1@2001-01-04), [2@2001-01-04]}" */ SELECT asText(setInterp(tgeompoint 'Interp=Step;{[Point(1 1)@2001-01-01, Point(2 2)@2001-01-02], [Point(3 3)@2001-01-05, Point(4 4)@2001-01-06]}', 'linear')); /* {[POINT(1 1)@2001-01-01, POINT(1 1)@2001-01-02), [POINT(2 2)@2001-01-02], [POINT(3 3)@2001-01-05, POINT(3 3)@2001-01-06), [POINT(4 4)@2001-01-06]} */
Desplazar el rango de valores or el intervalo de tiempo de un valor temporal con un valor or intervalo
shiftValue(tnumber,base) → tnumber
shiftTime(ttype,interval) → ttype
SELECT shiftValue(tint '{1@2001-01-01, 2@2001-01-03, 1@2001-01-05}', 1); -- {2@2001-01-02, 3@2001-01-04, 2@2001-01-06} SELECT shiftValue(tfloat '{[1@2001-01-01,2@2001-01-02],[3@2001-01-03,4@2001-01-04]}', -1); -- {[0@2001-01-01, 1@2001-01-02], [2@2001-01-03, 3@2001-01-04]}
SELECT shiftTime(tint '{1@2001-01-01, 2@2001-01-03, 1@2001-01-05}', '1 day'); -- {1@2001-01-02, 2@2001-01-04, 1@2001-01-06} SELECT shiftTime(tfloat '[1@2001-01-01, 2@2001-01-03]', '1 day'); -- [1@2001-01-02, 2@2001-01-04] SELECT asText(shiftTime(tgeompoint '{[Point(1 1)@2001-01-01, Point(2 2)@2001-01-03], [Point(2 2)@2001-01-04, Point(1 1)@2001-01-05]}', '1 day')); /* {[POINT(1 1)@2001-01-02, POINT(2 2)@2001-01-04], [POINT(2 2)@2001-01-05, POINT(1 1)@2001-01-06]} */
Escalear el rango de valores o el intervalo de tiempo de un valor temporal a un valor o intervalo
scaleValue(tnumber,width) → tnumber
scaleTime(ttype,interval) → ttype
Si el rango de valores o el intervalo de tiempo del valor temporal es cero (por ejemplo, para un instante temporal), el resultado es el valor temporal. El ancho o intervalo dado debe ser estrictamente mayor que cero.
SELECT scaleValue(tint '1@2001-01-01', 1); -- 1@2001-01-01 SELECT scaleValue(tfloat '{[1@2001-01-01,2@2001-01-02], [3@2001-01-03,4@2001-01-04]}', 6); -- {[1@2001-01-01, 3@2001-01-03], [5@2001-01-05, 7@2001-01-07]} SELECT scaleValue(tint '1@2001-01-01', -1); -- ERROR: The value must be strictly positive: -1
SELECT scaleTime(tint '1@2001-01-01', '1 day'); -- 1@2001-01-01 SELECT scaleTime(tint '{1@2001-01-01, 2@2001-01-03, 1@2001-01-05}', '1 day'); -- {1@2001-01-01 00:00:00+01, 2@2001-01-01 12:00:00+01, 1@2001-01-02 00:00:00+01} SELECT scaleTime(tfloat '[1@2001-01-01, 2@2001-01-03]', '1 day'); -- [1@2001-01-01, 2@2001-01-02] SELECT asText(scaleTime(tgeompoint '{[Point(1 1)@2001-01-01, Point(2 2)@2001-01-02, Point(1 1)@2001-01-03], [Point(2 2)@2001-01-04, Point(1 1)@2001-01-05]}', '1 day')); /* {[POINT(1 1)@2001-01-01 00:00:00+01, POINT(2 2)@2001-01-01 06:00:00+01, POINT(1 1)@2001-01-01 12:00:00+01], [POINT(2 2) @2001-01-01 18:00:00+01, POINT(1 1)@2001-01-02 00:00:00+01]} */ SELECT scaleTime(tint '1@2001-01-01', '-1 day'); -- ERROR: The interval must be positive: -1 days
Desplazar y escalear el rango de valores o intervalo de tiempo de un valor temporal a los dos valores o intervalos
shiftScaleValue(tnumber,base,base) → tnumber
shiftScaleTime(ttype,interval,interval) → ttype
Estas funciones combinan las funciones shiftValue
y scaleValue
o shiftTime
y scaleTime
.
SELECT shiftScaleValue(tint '1@2001-01-01', 1, 1); -- 2@2001-01-01 SELECT shiftScaleValue(tfloat '{[1@2001-01-01,2@2001-01-02],[3@2001-01-03,4@2001-01-04]}', -1, 6); -- {[0@2001-01-01, 2@2001-01-02], [4@2001-01-03, 6@2001-01-04]}
SELECT shiftScaleTime(tint '1@2001-01-01', '1 day', '1 day'); -- 1@2001-01-02 SELECT shiftScaleTime(tint '{1@2001-01-01, 2@2001-01-03, 1@2001-01-05}', '1 day','1 day'); -- {1@2001-01-02 00:00:00+01, 2@2001-01-02 12:00:00+01, 1@2001-01-03 00:00:00+01} SELECT shiftScaleTime(tfloat '[1@2001-01-01, 2@2001-01-03]', '1 day', '1 day'); -- [1@2001-01-02, 2@2001-01-03] SELECT asText(shiftScaleTime(tgeompoint '{[Point(1 1)@2001-01-01, Point(2 2)@2001-01-02, Point(1 1)@2001-01-03], [Point(2 2)@2001-01-04, Point(1 1)@2001-01-05]}', '1 day', '1 day')); /* {[POINT(1 1)@2001-01-02 00:00:00+01, POINT(2 2)@2001-01-02 06:00:00+01, POINT(1 1)@2001-01-02 12:00:00+01], [POINT(2 2) @2001-01-02 18:00:00+01, POINT(1 1)@2001-01-03 00:00:00+01]} */
Extraer de un sequencia o un conjunto de secuencias temporales con interpolación linear los segmentos cuya distancia es menor o igual que el argumento dados y/o cuya duración es mayor o igual que el argumento dado
stops({ttypeContSeq,ttypeSeqSet},maxDist=0.0,minDuration='0 minutes') → ttypeSeqSet
Para los tipos espaciales, el tamaño del área se calcula como la diagonal del rectángulo mínimamente girado de los puntos de la subsecuencia. Para los tipos escalares, el tamaño se calcula como el ancho del intervalo circundante. Si no se proporciona maxDist
, se supone que es 0.0 y, por lo tanto, la función extrae los segmentos constantes del valor temporal dado. Para puntos temporales, la distancia se calcula en las unidades del sistema de coordenadas. Nótese que aunque la función acepta geometrías 3D, el cálculo siempre se realiza en 2D.
SELECT stops(tfloat '[1@2001-01-01, 1@2001-01-02, 2@2001-01-03]'); -- {[1@2001-01-01, 1@2001-01-02)} SELECT stops(tfloat '[1@2001-01-01, 1@2001-01-02, 2@2001-01-03]', 0.0, '2 days'); -- NULL SELECT asText(stops(tgeompoint '[Point(1 1)@2001-01-01, Point(1 1)@2001-01-02, Point(2 2)@2001-01-03, Point(2 2)@2001-01-04]')); /* {[POINT(1 1)@2001-01-01, POINT(1 1)@2001-01-02), [POINT(2 2)@2001-01-03, POINT(2 2)@2001-01-04]} */ SELECT asText(stops(tgeompoint '[Point(1 1 1)@2001-01-01, Point(1 1 1)@2001-01-02, Point(2 2 2)@2001-01-03, Point(2 2 2)@2001-01-04]', 1.75)); /* {[POINT Z (1 1 1)@2001-01-01, POINT Z (1 1 1)@2001-01-02, POINT Z (2 2 2)@2001-01-03, POINT Z (2 2 2)@2001-01-04]} */
Transformar un valor temporal no lineal en un conjunto de filas, cada una es una pareja compuesta de un valor de base y un conjunto de períodos durante el cual el valor temporal tiene el valor de base
unnest(ttype) → {(value,time)}
SELECT (un).value, (un).time FROM (SELECT unnest(tfloat '{1@2001-01-01, 2@2001-01-02, 1@2001-01-03}') AS un) t; -- 1 | {[2001-01-01, 2001-01-01], [2001-01-03, 2001-01-03]} -- 2 | {[2001-01-02, 2001-01-02]} SELECT (un).value, (un).time FROM (SELECT unnest(tint '[1@2001-01-01, 2@2001-01-02, 1@2001-01-03]') AS un) t; -- 1 | {[2001-01-01, 2001-01-02), [2001-01-03, 2001-01-03]} -- 2 | {[2001-01-02, 2001-01-03)} SELECT (un).value, (un).time FROM (SELECT unnest(tfloat '[1@2001-01-01, 2@2001-01-02, 1@2001-01-03]') AS un) t; -- ERROR: The temporal value cannot have linear interpolation SELECT ST_AsText((un).value), (un).time FROM (SELECT unnest(tgeompoint 'Interp=Step;[Point(1 1)@2001-01-01, Point(2 2)@2001-01-02, Point(1 1)@2001-01-03]') AS un) t; -- POINT(1 1) | {[2001-01-01, 2001-01-02), [2001-01-03, 2001-01-03]} -- POINT(2 2) | {[2001-01-02, 2001-01-03)}