在标准SQL BigQuery中舍入到最接近的MINUTE或HOUR

时间:2018-07-10 14:09:00

标签: google-bigquery

here所述,有一些简单的简短方法可以将T-SQL的四舍五入到最接近的MINUTE。

我希望获得与标准SQL相同的简短语法。

4 个答案:

答案 0 :(得分:4)

以下是用于BigQuery标准SQL

   
#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATETIME '2018-01-01 01:05:56' input_datetime 
)
SELECT input_datetime,
  DATETIME_TRUNC(input_datetime, MINUTE) rounded_to_minute,
  DATETIME_TRUNC(input_datetime, HOUR) rounded_to_hour
FROM `project.dataset.table`   

结果为

Row     input_datetime          rounded_to_minute       rounded_to_hour  
1       2018-01-01T01:05:56     2018-01-01T01:05:00     2018-01-01T01:00:00  

对于TIMESTAMPTIME数据类型-您可以分别使用-TIMESTAMP_TRUNC()TIME_TRUNC()

答案 1 :(得分:3)

这个问题有些含糊。在这种情况下,“四舍五入”的使用可以解释为“ 截短到最近的小时或分钟”,到目前为止,这种模式已经证明了这一点,并且在floor中可能有一个更接近的类比。比round要多。但是,在某些合理的情况下,人们可能希望将时间戳真正“舍入”到最近的小时,即模拟round操作。这当然是可行的:

with events as
(
  select timestamp('2020-04-21T18:21:55.967+00:00') as event_at
  union all
  select timestamp('2020-04-21T18:51:55.967+00:00') as event_at
)
select event_at
  , timestamp_trunc(event_at, hour) as event_truncated_hour
  , timestamp_trunc(timestamp_add(event_at, interval 30 minute), hour) as event_rounded_hour
from events

产生

| event_at                         | event_truncated_hour           | event_rounded_hour            |
|----------------------------------|--------------------------------|-------------------------------|
| 2020-04-21T18:21:55.967+00:00    | 2020-04-21T18:00:00.000+00:00  | 2020-04-21T18:00:00.000+00:00 |
| 2020-04-21T18:51:55.967+00:00    | 2020-04-21T18:00:00.000+00:00  | 2020-04-21T19:00:00.000+00:00 |

答案 2 :(得分:1)

BQ中也提供了相同的标准SQL语法

  

输入为日期时间 2018-01-01 01:05:56

select 
    DATETIME_ADD(datetime '1800-01-01 00:00:00',
    INTERVAL DATETIME_DIFF(datetime '2018-01-01 01:05:56','1800-01-01 00:00:00',MINUTE) MINUTE) as rounded_to_minute,

    DATETIME_ADD(datetime '2010-01-01 00:00:00',
    INTERVAL DATETIME_DIFF(datetime '2018-01-01 01:05:56','2010-01-01 00:00:00',HOUR) HOUR) as rounded_to_hour

产生:

+-----+---------------------+---------------------+--+
| Row |  rounded_to_minute  |   rounded_to_hour   |  |
+-----+---------------------+---------------------+--+
|   1 | 2018-01-01T01:05:00 | 2018-01-01T01:00:00 |  |
+-----+---------------------+---------------------+--+

答案 3 :(得分:0)

如果您有timestamp,则可以使用TIMESTAMP_TRUNC

Google documentation

这还允许您按指定的时区截断(例如,您可以为指定的时区指定一天的开始时间 。例如,将截断到维多利亚州的一天的开始时间,澳大利亚:

TIMESTAMP_TRUNC(sample_date_time, DAY, 'Australia/Victoria') as sample_date_time

您甚至可以使用聚合作为截断值,例如

TIMESTAMP_TRUNC(min(sample_date_time), DAY, 'Australia/Victoria') as sample_date_time,