Literales y tipos de datos de intervalo - Amazon Redshift

Literales y tipos de datos de intervalo

Puede usar un tipo de datos de intervalo para almacenar duraciones de tiempo en unidades como seconds, minutes, hours, days, months y years. Los literales y los tipos de datos de intervalo se pueden usar en los cálculos de fecha y hora, por ejemplo, agregar intervalos a fechas y marcas temporales, sumar intervalos y restar un intervalo de una fecha o marca temporal. Los literales de intervalo se pueden usar como valores de entrada para las columnas de tipos de datos de intervalos de una tabla.

Sintaxis del tipo de datos de intervalo

Para especificar un tipo de datos de intervalo para almacenar una duración de tiempo en años y meses:

INTERVAL year_to_month_qualifier

Para especificar un tipo de datos de intervalo para almacenar una duración en días, horas, minutos y segundos:

INTERVAL day_to_second_qualifier [ (fractional_precision) ]

Sintaxis de literal de intervalo

Para especificar un literal de intervalo para definir una duración de tiempo en años y meses:

INTERVAL quoted-string year_to_month_qualifier

Para especificar un literal de intervalo para definir una duración en días, horas, minutos y segundos:

INTERVAL quoted-string day_to_second_qualifier [ (fractional_precision) ]

Argumentos

quoted-string

Especifica un valor numérico positivo o negativo especificando una cantidad y la unidad de fecha y hora como cadena de entrada. Si quoted-string contiene solo un valor numérico, Amazon Redshift determina las unidades de year_to_month_qualifier o day_to_second_qualifier. Por ejemplo, '23' MONTH representa 1 year 11 months, '-2' DAY representa -2 days 0 hours 0 minutes 0.0 seconds, '1-2' MONTH representa 1 year 2 months y '13 day 1 hour 1 minute 1.123 seconds' SECOND representa 13 days 1 hour 1 minute 1.123 seconds. Para obtener más información acerca de los formatos de salida de un intervalo, consulte Estilos de intervalo.

year_to_month_qualifier

Especifica el rango del intervalo. Si usa un calificador y crea un intervalo con unidades de tiempo más pequeñas que el calificador, Amazon Redshift corta y descarta las partes más pequeñas del intervalo. Los valores válidos para year_to_month_qualifier son:

  • YEAR

  • MONTH

  • YEAR TO MONTH

day_to_second_qualifier

Especifica el rango del intervalo. Si usa un calificador y crea un intervalo con unidades de tiempo más pequeñas que el calificador, Amazon Redshift corta y descarta las partes más pequeñas del intervalo. Los valores válidos para day_to_second_qualifier son:

  • DAY

  • HOUR

  • MINUTE

  • SECOND

  • DAY TO HOUR

  • DAY TO MINUTE

  • DAY TO SECOND

  • HOUR TO MINUTE

  • HOUR TO SECOND

  • MINUTE TO SECOND

El resultado del literal INTERVAL se trunca al componente INTERVAL más pequeño especificado. Por ejemplo, al usar un calificador MINUTE, Amazon Redshift descarta las unidades de tiempo inferiores a MINUTE.

select INTERVAL '1 day 1 hour 1 minute 1.123 seconds' MINUTE

El valor resultante se trunca en '1 day 01:01:00'.

fractional_precision

Parámetro opcional que especifica el número de dígitos fraccionales permitidos en el intervalo. El argumento fractional_precision solo se debe especificar si el intervalo contiene SECOND. Por ejemplo, SECOND(3) crea un intervalo que permite solo tres dígitos fraccionales, como 1234 segundos. El número máximo de dígitos fraccionales es seis.

La configuración de la sesión interval_forbid_composite_literals determina si se devuelve un error cuando se especifica un intervalo con las partes YEAR TO MONTH y DAY TO SECOND. Para obtener más información, consulte interval_forbid_composite_literals.

Aritmética de intervalos

Puede utilizar valores de intervalo con otros valores de fecha y hora para realizar operaciones aritméticas. En la siguiente tabla se describen las operaciones disponibles y los resultados de tipo de datos de cada operación. Por ejemplo, cuando se agrega un interval a una date el resultado es una date si es un intervalo YEAR TO MONTH y una marca temporal si es un intervalo DAY TO SECOND.

Date Timestamp Interval Numérico
Intervalo - N/A N/A Interval N/A
+ Date Date/Timestamp Interval N/A
* N/A N/A N/A Interval
/ N/A N/A N/A Interval
Fecha - Numérico Interval Date/Timestamp Date
+ N/A N/A N/A N/A
Timestamp - Interval Interval Timestamp Timestamp
+ N/A N/A N/A N/A

Estilos de intervalo

Puede utilizar el comando SET de SQL para cambiar el formato de pantalla de salida de los valores de intervalos. Cuando utilice el tipo de datos de intervalo en SQL, conviértalo en texto para ver el estilo de intervalo esperado, por ejemplo, YEAR TO MONTH::text. Los valores disponibles para ESTABLECER el valor IntervalStyle son:

  • postgres: sigue el estilo de PostgreSQL. Esta es la opción predeterminada.

  • postgres_verbose: sigue el estilo detallado de PostgreSQL.

  • sql_standard: sigue el estilo de literales de intervalo estándar de SQL.

El siguiente comando establece el estilo de intervalo en sql_standard.

SET IntervalStyle to 'sql_standard';

Formato de salida postgres

A continuación, se muestra el formato de salida del estilo de intervalo postgres. Cada valor numérico puede ser negativo.

'<numeric> <unit> [, <numeric> <unit> ...]'
select INTERVAL '1-2' YEAR TO MONTH::text varchar --------------- 1 year 2 mons
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text varchar ------------------ 1 day 02:03:04.5678

Formato de salida postgres_verbose

La sintaxis de postgres_verbose es similar a la de postgres, pero las salidas de postgres_verbose también contienen la unidad de tiempo.

'[@] <numeric> <unit> [, <numeric> <unit> ...] [direction]'
select INTERVAL '1-2' YEAR TO MONTH::text varchar ----------------- @ 1 year 2 mons
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text varchar --------------------------- @ 1 day 2 hours 3 mins 4.56 secs

Formato de salida sql_standard

Los valores del intervalo de año a mes tienen el siguiente formato. Si se especifica un signo negativo antes del intervalo, eso indica que el intervalo es un valor negativo y se aplica a todo el intervalo.

'[-]yy-mm'

Los valores del intervalo de día a segundo tienen el siguiente formato.

'[-]dd hh:mm:ss.ffffff'
SELECT INTERVAL '1-2' YEAR TO MONTH::text varchar ------- 1-2
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text varchar --------------- 1 2:03:04.5678

Ejemplos de tipo de datos de intervalo

En los siguientes ejemplos, se muestra cómo usar tipos de datos INTERVAL con tablas.

create table sample_intervals (y2m interval month, h2m interval hour to minute); insert into sample_intervals values (interval '20' month, interval '2 days 1:1:1.123456' day to second); select y2m::text, h2m::text from sample_intervals; y2m | h2m ---------------+----------------- 1 year 8 mons | 2 days 01:01:00
update sample_intervals set y2m = interval '2' year where y2m = interval '1-8' year to month; select * from sample_intervals; y2m | h2m ---------+----------------- 2 years | 2 days 01:01:00
delete from sample_intervals where h2m = interval '2 1:1:0' day to second; select * from sample_intervals; y2m | h2m -----+-----

Ejemplos de literales de intervalo

Los siguientes ejemplos se ejecutan con el estilo de intervalo establecido en postgres.

En el siguiente ejemplo, se muestra cómo crear un literal INTERVAL de 1 año.

select INTERVAL '1' YEAR intervaly2m --------------- 1 years 0 mons

Si especifica una quoted-string que supere el calificador, las unidades de tiempo restantes se truncan con respecto al intervalo. En el ejemplo siguiente, un intervalo de 13 meses se convierte en 1 año y 1 mes, pero el mes restante se omite debido al calificador YEAR.

select INTERVAL '13 months' YEAR intervaly2m --------------- 1 years 0 mons

Si utiliza un calificador inferior a la cadena de intervalos, se incluyen las unidades sobrantes.

select INTERVAL '13 months' MONTH intervaly2m --------------- 1 years 1 mons

Al especificar una precisión en el intervalo, se trunca el número de dígitos fraccionarios hasta alcanzar la precisión especificada.

select INTERVAL '1.234567' SECOND (3) intervald2s -------------------------------- 0 days 0 hours 0 mins 1.235 secs

Si no especifica una precisión, Amazon Redshift utiliza la precisión máxima de 6.

select INTERVAL '1.23456789' SECOND intervald2s ----------------------------------- 0 days 0 hours 0 mins 1.234567 secs

En el siguiente ejemplo, se muestra cómo crear un intervalo con rangos.

select INTERVAL '2:2' MINUTE TO SECOND intervald2s ------------------------------ 0 days 0 hours 2 mins 2.0 secs

Los calificadores dictan las unidades que se especifican. Por ejemplo, aunque en el siguiente ejemplo se utiliza la misma quoted-string de “2:2” que en el ejemplo anterior, Amazon Redshift reconoce que utiliza diferentes unidades de tiempo debido al calificador.

select INTERVAL '2:2' HOUR TO MINUTE intervald2s ------------------------------ 0 days 2 hours 2 mins 0.0 secs

También se admiten las abreviaturas y los plurales de cada unidad. Por ejemplo, 5s, 5 second y 5 seconds son intervalos equivalentes. Las unidades admitidas son años, meses, horas, minutos y segundos.

select INTERVAL '5s' SECOND intervald2s ------------------------------ 0 days 0 hours 0 mins 5.0 secs
select INTERVAL '5 HOURS' HOUR intervald2s ------------------------------ 0 days 5 hours 0 mins 0.0 secs
select INTERVAL '5 h' HOUR intervald2s ------------------------------ 0 days 5 hours 0 mins 0.0 secs