BigQuery 提供两种 SQL 模式。最初的答案是基于 Legacy Mode,但后来我决定通过添加 Standard Mode 替代方案来更新答案。
传统模式
要将timestamp 转换为date,您可以使用BigQuery date/time functions:
SELECT TIMESTAMP(1424184621000000) # 2015-02-17 14:50:21 UTC
SELECT TIMESTAMP_MICROS(1230219000000000) # 2008-12-25 15:30:00 UTC
SELECT TIMESTAMP_MILLIS(1230219000000) # 2008-12-25 15:30:00 UTC
SELECT DATE(TIMESTAMP(1424184621000000)) # 2015-02-17
SELECT DATE(TIMESTAMP('2015-02-17')) # 2015-02-17
SELECT INTEGER(TIMESTAMP('2015-02-17')) # 1424131200000000
要计算两个日期之间的天数(例如 2015 年 6 月 1 日到 2015 年 6 月 20 日之间),您可以这样做:
SELECT (DATEDIFF(TIMESTAMP('2015-06-20'), TIMESTAMP('2015-06-01')) + 1)
最后要计算工作日,您可以使用以下方法:
SELECT
(DATEDIFF(TIMESTAMP('2015-06-20'), TIMESTAMP('2015-06-01')) + 1)
-(INTEGER((DATEDIFF(TIMESTAMP('2015-06-20'), TIMESTAMP('2015-06-01')) + 1) / 7) * 2)
-(CASE WHEN DAYOFWEEK(TIMESTAMP('2015-06-01')) = 1 THEN 1 ELSE 0 END)
-(CASE WHEN DAYOFWEEK(TIMESTAMP('2015-06-20')) = 7 THEN 1 ELSE 0 END)
这是一个简单的工作日计算,将周六和周日视为周末,不涉及任何节假日。
标准模式
这里有一些示例函数可以用来处理TIMESTAMP 和DATE。
SELECT TIMESTAMP_SECONDS(1230219000) -- 2008-12-25 15:30:00 UTC
SELECT TIMESTAMP_MILLIS(1230219000000) -- 2008-12-25 15:30:00 UTC
SELECT TIMESTAMP_MICROS(1230219000000000) -- 2008-12-25 15:30:00 UTC
SELECT DATE(TIMESTAMP_SECONDS(1230219000)) -- 2008-12-25
SELECT CAST('2008-12-25' AS DATE) -- 2008-12-25
SELECT DATE('2008-12-25', 'UTC') -- 2008-12-25
用于计算两个日期之间的天数:
SELECT DATE_DIFF(DATE('2015-06-20'), DATE('2015-06-01'), DAY)
最后像上面一样计算简单的工作日:
SELECT
DATE_DIFF(DATE('2015-06-20'), DATE('2015-06-01'), DAY)
- DIV(DATE_DIFF(DATE('2015-06-20'), DATE('2015-06-01'), DAY),7)*2
- IF(EXTRACT(DAYOFWEEK FROM DATE('2015-06-01'))=1,1,0)
- IF(EXTRACT(DAYOFWEEK FROM DATE('2015-06-20'))=7,1,0)