如何在BigQuery SQL中从历元时间提取日期

如何在BigQuery SQL中从历元时间提取日期,sql,google-bigquery,Sql,Google Bigquery,我在大纪元时间中存储了日期,我想提取 从它的日期。我尝试了下面的代码,结果输出为null date_add( (timestamp( Hp.ASSIGN_TIME)), 1970-01-01,"second" ) as Extracted_date_Epoch Ex time Format142418462000000 还有一个问题。下面的代码正确地给出了天,但不是工作日,它给出了所有天, 是否可以在大纪元时间中存储两次之间的两个工作日 INTEGER(((Hp.ASSIGN_TIME - H

我在大纪元时间中存储了日期,我想提取 从它的日期。我尝试了下面的代码,结果输出为null

date_add( (timestamp( Hp.ASSIGN_TIME)), 1970-01-01,"second" ) as Extracted_date_Epoch
Ex time Format142418462000000

还有一个问题。下面的代码正确地给出了天,但不是工作日,它给出了所有天, 是否可以在大纪元时间中存储两次之间的两个工作日

INTEGER(((Hp.ASSIGN_TIME - Hp.ARRIVAL_TIME) / 1000000) / 86400) as Days

BigQuery提供了两种SQL模式。最初的答案基于遗留模式,但后来我决定通过添加标准模式替代方案来更新答案

传统模式 要将时间戳转换为日期,您可以使用:

要计算两个日期之间的天数(例如,从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)
这是一个简单的工作日计算,将周六和周日视为周末,不包括任何节假日

标准模式 下面是一些用于处理时间戳和日期的示例函数

选择时间戳_SECONDS1230219000-2008-12-25 15:30:00 UTC 选择时间戳_millis123219000000-2008-12-25 15:30:00 UTC 选择时间戳_micros12302190000000-2008-12-25 15:30:00 UTC 选择DATETIMESTAMP_SECONDS1230219000-2008-12-25 选择演员“2008-12-25”作为日期-2008-12-25 选择日期'2008-12-25','UTC'-2008-12-25 用于计算两个日期之间的天数:

选择日期“2015-06-20”,日期“2015-06-01”,日期 最后计算简单的工作日,如下所示:

选择 日期2015-06-20,日期2015-06-01,日期 -DIVDATE_DIFFDATE'2015-06-20',DATE'2015-06-01',第7天*2 -如果从日期'2015-06-01'算起的每周提取日=1,1,0 -如果从日期'2015-06-20'算起的每周提取日=7,1,0
如果在BigQuery中使用standardSQL方言,则此函数将转换为人类可读的时间戳 时间戳142418462000000->2015-02-17 14:50:21 UTC。 裁判:


或者,TIMESTAMP_seconds可视开始时间为秒,例如在Google Analytics中。

如果您有传统SQL选项,请回答问题1, 给定一列UNIX历元时间(以毫秒为单位),如1524375336000

我曾经 选择USEC_TO_TIMESTAMPHp.ASSIGN_TIME*1000作为表中的_日期

USEC_TO_时间戳将UNIX时间戳(以微秒为单位)转换为 时间戳数据类型

例如:

选择USEC_TO_TIMESTAMP1349053323000000


非常感谢你,库巴尼。明亮的在过去的几天里,我一直在忙于工作。就像魔术一样。我很乐意把它作为答案。我不知道怎么做,我看到的只是回答你的问题。我看不到投票、喜欢或将其标记为答案的选项。我该怎么做?这只在传统模式下有效。参数类型INT64的函数时间戳没有匹配的签名。支持的签名:TIMESTAMPSTRING,[STRING];时间戳日期,[字符串];TIMESTAMPDATETIME,[STRING]at[1:8]如果您不使用传统模式,则需要类似于:TIMESTAMP\u MICROS的内容@谢谢你的评论。我刚刚添加了标准SQL模型。TIMESTAMP_MICROSvisitStartTime*1000000对于GA数据非常有用,谢谢!或者,时间戳_SECONDSvisitStartTime用于GA
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)
╔═══╦═══════════════╦═════════════════════════════╗
║   ║ ASSIGN_TIME   ║ the_date                    ║
╠═══╬═══════════════╬═════════════════════════════╣
║ 1 ║ 1524375336000 ║ 2018-04-22 05:35:36.000 UTC ║
╚═══╩═══════════════╩═════════════════════════════╝