如here所述,有一些简单的简短方法可以将T-SQL的四舍五入到最接近的MINUTE。
我希望获得与标准SQL相同的简短语法。
答案 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
对于TIMESTAMP
或TIME
数据类型-您可以分别使用-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
:
这还允许您按指定的时区截断(例如,您可以为指定的时区指定一天的开始时间 。例如,将截断到维多利亚州的一天的开始时间,澳大利亚:
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,