SQL:如何以有效的方式从整数中提取某些数字?

时间:2020-03-22 19:19:00

标签: sql google-bigquery

我正在使用Google大查询,并且我有一个与HMMSS一样为整数的字段TIME。我需要提取某些数字来创建3列:TIME_SECOND,TIME_MINUTE,TIME_HOUR。

“时间”列和必需的整数列的示例:

   TIME     TIME_HOUR    TIME_MINUTE  TIME_SECOND
----------  ---------    ---------   ----------
     2      |  00     |    00     |      02
    10      |  00     |    00     |      10
   111      |  00     |    01     |      11
  1858      |  00     |    18     |      58  
 12316      |  01     |    23     |      16 
234559      |  23     |    45     |      59

理想地,它需要尽可能高效,因为此计算将在大型表上进行。

谢谢!

2 个答案:

答案 0 :(得分:1)

以下是BigQuery标准SQL

#standardSQL
SELECT 
  time,
  CAST(time / 10000 AS INT64) AS time_hour,
  MOD(CAST(FLOOR(time / 100) AS INT64), 100) AS time_minute,
  MOD(time, 100 ) AS time_second 
FROM `project.dataset.table`   

如果要应用于您的问题的样本数据-输出为

Row     time        time_hour   time_minute time_second  
1       2           0           0           2    
2       10          0           0           10   
3       111         0           1           11   
4       1858        0           18          58   
5       12316       1           23          16   
6       234559      23          45          59  

上面产生整数-同时,在示例输出中,它看起来像您可能期望的字符串:({0001等)-如果是这样-在下面使用

#standardSQL
SELECT 
  time, 
  y[OFFSET(1)] AS time_hour,
  y[OFFSET(2)] AS time_minute,
  y[OFFSET(3)] AS time_second
FROM `project.dataset.table`,
UNNEST([CAST(10000000 + time AS STRING)]) x,
UNNEST([STRUCT(REGEXP_EXTRACT_ALL(x, r'\d\d') AS y)])   

有输出

Row     time        time_hour   time_minute time_second  
1       2           00          00          02   
2       10          00          00          10   
3       111         00          01          11   
4       1858        00          18          58   
5       12316       01          23          16   
6       234559      23          45          59   

答案 1 :(得分:-1)

您可以使用算术:

select (time / 10000) as time_hour,
       (floor(time / 100) % 100) as time_minute,
       (time % 100 )as time_second