如何在bigquery中获得浮动或十进制的两个日期时间之间的小时差

Posted

技术标签:

【中文标题】如何在bigquery中获得浮动或十进制的两个日期时间之间的小时差【英文标题】:How to get difference in hours between two datetime in floating or decimal in bigquery 【发布时间】:2020-07-17 12:29:30 【问题描述】:

我在以十进制计算两个日期之间的差异时遇到问题。

Date1:- 2019-07-02 16:42:06
Date2:- 2019-07-02 15:53:01

预期结果:- 0:49:05

select datetime_diff('2019-07-02 16:42:06','2019-07-02 15:53:01',Hour)

BigQuery 输出:-1

【问题讨论】:

【参考方案1】:

如果你想要一个十进制值,那么使用更小的单位和算术:

select datetime_diff('2019-07-02 16:42:06', '2019-07-02 15:53:01', second) / (60 * 60.0) as decimal_hours

您的样本结果不是十进制值。

【讨论】:

实际上我需要 0 或 0:49。商定的预期输出不是十进制的,它的时间。此外,这只是示例,并在此输出上应用了进一步的计算。【参考方案2】:

预期结果:- 0:49:05

以下是 BigQuery 标准 SQL

  SELECT FORMAT('%i%s', 
    DIV(DATETIME_DIFF(date1, date2, MINUTE), 60),
    FORMAT_TIME(':%M:%S', TIME(DATETIME_ADD(DATETIME(TIMESTAMP(DATE(1970, 1, 1))), INTERVAL DATETIME_DIFF(date1, date2, SECOND) SECOND)))
  ) AS diff     

对于 DATETIME '2019-07-05 17:42:06' date1,DATETIME '2019-07-02 15:53:01' date2 它给出

diff     
73:49:05     

对于 DATETIME '2019-07-02 17:42:06' date1,DATETIME '2019-07-02 15:53:01' date2 结果为

diff     
1:49:05  

对于 DATETIME '2019-07-02 16:42:06' date1,DATETIME '2019-07-02 15:53:01' date2(如您的问题)结果是

diff     
0:49:05   

如果您知道差异将在 24 小时内,您可以使用以下更简单的语句

FORMAT_TIME('%T', TIME(DATETIME_ADD(DATETIME(TIMESTAMP(DATE(1970, 1, 1))), INTERVAL DATETIME_DIFF(date1, date2, SECOND) SECOND)))   

对于最后两个示例,结果将分别为01:49:0500:49:05

【讨论】:

以上是关于如何在bigquery中获得浮动或十进制的两个日期时间之间的小时差的主要内容,如果未能解决你的问题,请参考以下文章

如何在php/codeigniter或mysql中获得两个相差20分钟的日期的所有组合

如何在标准 SQL 的 BigQuery 中过滤具有 iso 周值的列?

如何在 BigQuery 中生成日期系列并为缺失的销售数据填充零

BigQuery如何获得每月的总数?

BigQuery 计算两个日期范围重叠

为什么我无法从std :: stringstream二进制流中获得完全精度(double,float)