2017-05-26 67 views
0

我使用StandartSQL for Bigquery。我需要找到在上午,下午或傍晚发生的所有事件。我可以做这样的事情Bigquery按事件时间查询

WHERE TIMESTAMP_MICROS(event.timestamp_micros) BETWEEN '2017-04-01 12:00:00' AND '2017-06-01 16:00:00' 

但我只需要没有日期的时间。有什么方法只能按时间查询吗?

回答

2

BigQuery中的标准SQL可以使用

EXTRACT(HOUR FROM TIMESTAMP_MICROS(event.timestamp_micros)) 

下面是使用例子

#standardSQL 
SELECT 
    CASE 
    WHEN hr >= 4 AND hr < 12 THEN 'morning' 
    WHEN hr >= 12 AND hr < 15 THEN 'afternoon' 
    WHEN hr >= 15 AND hr < 17 THEN 'late_afternoon' 
    WHEN hr >= 17 AND hr < 19 THEN 'evening' 
    WHEN hr >= 19 AND hr < 21 THEN 'late_evening' 
    ELSE 'night' 
    END AS day_part 
FROM `dataset.yourtable`, 
UNNEST([EXTRACT(HOUR FROM TIMESTAMP_MICROS(event.timestamp_micros))]) AS hr 
+0

太好了。谢谢 – DzouSi

1

有两种根本不同的方法。一种方法是将该值转换为时间戳,然后使用时间戳 - 例如通过格式化该值为一个小时。

另一种方法是只用微秒。你可以用分割和模数算术来做你想要的。因此,要计算一天中的小时:

where mod(cast(event.timestamp_micros/(1000000 * 60 * 60) as int64), 24) between 12 and 13 

请注意,这会从12:00:00和13:59.59.999999得到时间。

+0

我得到错误:对于参数类型:FLOAT64,INT64,函数MOD没有匹配的签名。支持的签名:MOD(INT64,INT64) – DzouSi

1

的BigQuery有TIME type,您可以使用。例如,

SELECT 
    COUNTIF(time BETWEEN '04:00:00' AND '12:00:00') AS morning_events, 
    COUNTIF(time BETWEEN '12:00:00' AND '20:00:00') AS evening_events, 
    COUNTIF(time < '04:00:00' OR time > '20:00:00') AS night_events 
FROM (
    SELECT 
    EXTRACT(TIME FROM TIMESTAMP_MICROS(event.timestamp_micros)) AS time 
    FROM YourTable 
);