2016-05-05 55 views
1

我将数据从BigQuery移动到Oracle数据库,并试图找到处理时间戳的最佳方法。 Oracle DB只能导入csv文件,其日期格式为小端格式(dd/mm/yyyy hh:mi:ss),但默认情况下,BigQuery仅支持大端格式(yyyy-mm-dd hh:mi:ss)。时间戳与自定义格式的字符串

SELECT 
    t, 
    STRING(t) s 
FROM 
    (SELECT TIMESTAMP(132456789101112) t) 
Row t       s 
1  1974-03-14 01:33:09 UTC 1974-03-14 01:33:09.101112 

我当然可以提取时间戳的不同组件,并将它们手工粘贴在一起(见下文),或写一些聪明的UDF,但我会感到惊讶,如果没有任何办法用BigQuery的标准功能来做到这一点。这似乎是一件很平常的事情,我事实上犹豫了一段时间。

SELECT 
    t, 
    CONCAT(
    RIGHT(CONCAT("0", STRING(DAY(t))), 2), "/", 
    RIGHT(CONCAT("0", STRING(MONTH(t))), 2), "/", 
    RIGHT(CONCAT("000", STRING(YEAR(t))), 4), " ", 
    TIME(t) 
) s 
FROM 
    (SELECT TIMESTAMP(132456789101112) t) 
Row t       s  
1  1974-03-14 01:33:09 UTC 14/03/1974 01:33:09 

有没有像FORMAT(t, "dd/mm/yyyy hh:mi:ss")东西还是有办法用正则表达式来做到这一点? (而不必Concat的几个REGEXP_EXTRACT

回答

6

检查STRFTIME_UTC_USEC

SELECT STRFTIME_UTC_USEC(CURRENT_TIMESTAMP(), '%d/%m/%Y %H:%M:%S') 

或与您的例子

SELECT STRFTIME_UTC_USEC(TIMESTAMP(132456789101112), '%d/%m/%Y %H:%M:%S') 
1

它不是一个简单的功能,但它的工作...

SELECT 
    t, 
    CONCAT(LPAD(STRING(DAY(t)),2,"0"),"/",LPAD(STRING(MONTH(t)),2,"0"),"/",STRING(YEAR(t))," ",TIME(t)) s 
FROM (
    SELECT 
    TIMESTAMP(132456789101112) t) 
0

对于那些使用Bigquery的标准SQL的人来说, t这样做的方式是与

FORMAT_TIMESTAMPFORMAT_DATE取决于您的输入。

例如:

SELECT FORMAT_TIMESTAMP('%Y/%m/%d', TIMESTAMP('2017-11-01')) 将返回 2017/11/01