Estoy tratando de ejecutar una consulta en Big-Query usando SQL estándar.

Tengo una columna en mi tabla donde se presenta la hora en este formato: 170519

Lo que quiero hacer es agregar dos puntos (:) después de cada dos números para obtener resultados como este: 17:05:19

¿Cómo hago esto?

He estado buscando pero no he podido encontrar una solución a esto. ¿Quizás no estoy buscando con las palabras correctas?

¡Gracias por la ayuda!

EDIT:

Entonces, la respuesta de @Gordon Linoff funciona para una columna.

Ahora, ¿cómo lo uso cuando combino dos columnas?

Aquí está mi código donde obtengo un error de sintaxis:

SELECT
  CONCAT(FORMAT_DATE("%Y-%m-%d", PARSE_DATE('%d%m%Y',
        Date1)), '  ',(PARSE_TIME("%H%M%S",
        Time1)) AS Date_Time
  FROM
0
Ahmed 10 may. 2019 a las 18:24

5 respuestas

La mejor respuesta

Ejemplo a continuación para BigQuery Standard SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '09052019' date1, '170519' time1 UNION ALL
  SELECT '10052019', '091020'
)
SELECT PARSE_DATETIME('%d%m%Y%H%M%S', CONCAT(date1, time1)) date_time,
  CAST(PARSE_DATETIME('%d%m%Y%H%M%S', CONCAT(date1, time1)) AS STRING) date_time_as_string
FROM `project.dataset.table`

Con resultado

Row     date_time               date_time_as_string  
1       2019-05-09T17:05:19     2019-05-09 17:05:19  
2       2019-05-10T09:10:20     2019-05-10 09:10:20  
0
Mikhail Berlyant 10 may. 2019 a las 18:51

Aquí hay un ejemplo que puede probar (copie y pegue esto en el editor en https://console.cloud .google.com / bigquery):

CREATE TEMP FUNCTION InsertColons(s STRING) AS (
  CONCAT(SUBSTR(s, 1, 2), ':', SUBSTR(s, 3, 2), ':', SUBSTR(s, 5, 2))
);

SELECT s, InsertColons(s) AS result
FROM (
  SELECT '123456' AS s UNION ALL
  SELECT '170519'
);

La función SUBSTR selecciona partes de la cadena, p. Ej. los primeros dos caracteres en el ordinal 1, luego los primeros dos caracteres en el ordinal 3, luego en el ordinal 5, antes de usar CONCAT para combinar las partes.

2
Elliott Brossard 10 may. 2019 a las 15:34

Podrías hacer algo como esto:

SELECT LEFT(c, 2) + ':' + SUBSTRING(c, 3, 2) + ':' + SUBSTRING(c, 5, 2)
FROM
    -- Use your own table in the FROM statement instead of this fake one
    (SELECT '170519' as c ) as q1

Devuelve 17:05:19

O con tus datos:

SELECT LEFT(timo, 2) + ':' + SUBSTRING(timo, 3, 2) + ':' + SUBSTRING(timo, 5, 2)
FROM
    table1
1
ibiza 10 may. 2019 a las 15:36

Lo convertiría en un tipo de datos time en lugar de una cadena:

select parse_time('%H%M%S', '170519')

Si comienza como un número:

select parse_time('%H%M%S', cast(170519 as string))

Si desea formatear esto como una cadena, puede formatear la hora. Por ejemplo, lo siguiente pondría esto en formato HH: MM:

select format_time('%H:%M', parse_time('%H%M%S', cast(170519 as string)))

Soy una fan de almacenar cosas en el tipo correcto.

1
Gordon Linoff 10 may. 2019 a las 15:55
SELECT  CONCAT(SUBSTRING('170519', 1, 2), ':', SUBSTRING('170519',3, 2), ':', SUBSTRING('170519',5, 2))

Esto te da ansias adecuadas como 17:05:19

0
xiawi 6 may. 2020 a las 09:50