2017-05-26 2 views
0

Ich benutze StandartSQL für BigQuery. Ich muss alle Ereignisse finden, die am Morgen, Nachmittag oder Abend passiert sind. Ich kann dies etwas tun, wieBigquery fragt nach Zeitpunkt des Ereignisses

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

Aber ich brauche nur Zeit ohne Datum. Gibt es eine Möglichkeit, nur nach Zeit abzufragen?

Antwort

2

in BigQuery Standard-SQL können Sie

EXTRACT(HOUR FROM TIMESTAMP_MICROS(event.timestamp_micros)) 

Im Folgenden verwenden Verwendungsbeispiel

#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

Großartig. Vielen Dank – DzouSi

1

Es gibt zwei grundsätzlich unterschiedliche Ansätze. Eine besteht darin, den Wert in einen Zeitstempel zu konvertieren und dann mit dem Zeitstempel zu arbeiten - indem Sie den Wert beispielsweise als Stunde formatieren.

Eine andere ist nur mit den Mikrosekunden zu arbeiten. Sie können tun, was Sie wollen mit Division und Modularithmetik. Also, um die Stunde des Tages zu berechnen:

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

Beachten Sie, dass diese bekommt Zeiten von 00.00.00 und 13: 59.59.999999.

+0

Ich bekomme Fehler: Keine passende Signatur für die Funktion MOD für Argumenttypen: FLOAT64, INT64. Unterstützte Signaturen: MOD (INT64, INT64) – DzouSi

1

BigQuery eine TIME type hat, die Sie verwenden können. Zum Beispiel

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 
); 
Verwandte Themen