【问题标题】:How can I extract date from epoch time in BigQuery SQL如何从 BigQuery SQL 中的纪元时间中提取日期
【发布时间】:2015-08-21 11:45:00
【问题描述】:
  1. 我有日期存储在Epoch Time,我想提取 Date 来自它。我尝试了下面的代码,我得到null 作为输出。

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

    Ex时间格式(1424184621000000)

  2. 还有一个问题。下面的代码给了我正确的天数,但不是工作日,它给了我所有的天数, 是否可以在 Epoch 时间存储两次之间的工作日?

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

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    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)
    

    这是一个简单的工作日计算,将周六和周日视为周末,不涉及任何节假日。

    标准模式

    这里有一些示例函数可以用来处理TIMESTAMPDATE

    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)
    

    【讨论】:

    • 非常感谢 Qorbani。杰出的。最近几天我一直在与工作日作斗争。像魔术一样工作。
    • Qorbani 我很乐意将其标记为答案。我不知道怎么做,我只看到回答你的问题。我看不到投票或喜欢它或将其标记为答案的选项。我该怎么做?
    • 这只适用于传统模式。 No matching signature for function TIMESTAMP for argument types: INT64. Supported signatures: TIMESTAMP(STRING, [STRING]); TIMESTAMP(DATE, [STRING]); TIMESTAMP(DATETIME, [STRING]) at [1:8]
    • 如果您不使用旧模式,则需要类似:TIMESTAMP_MICROS()。 cloud.google.com/bigquery/docs/reference/standard-sql/…
    • @CosminLehene 感谢您的评论。我刚刚也添加了标准 SQL 模型。
    【解决方案2】:

    如果您在 BigQuery 中使用标准 SQL 方言,此函数会转换为人类可读的时间戳 TIMESTAMP_MICROS(1424184621000000) --> 2015-02-17 14:50:21 UTC。 参考: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#timestamp-string

    或者TIMESTAMP_SECONDS(visitStartTime) 秒,例如在谷歌分析中。

    【讨论】:

    • TIMESTAMP_MICROS(visitStartTime*1000000) 非常适合 GA 数据,谢谢!
    • 对于 GA 或者 TIMESTAMP_SECONDS(visitStartTime)
    【解决方案3】:

    如果您有 Legacy SQL 选项,请回答问题 1, 给定一列以毫秒为单位的 UNIX 纪元时间,例如 1524375336000,

    我用过 SELECT USEC_TO_TIMESTAMP(Hp.ASSIGN_TIME * 1000) AS the_date FROM table;

    ╔═══╦═══════════════╦═════════════════════════════╗
    ║   ║ ASSIGN_TIME   ║ the_date                    ║
    ╠═══╬═══════════════╬═════════════════════════════╣
    ║ 1 ║ 1524375336000 ║ 2018-04-22 05:35:36.000 UTC ║
    ╚═══╩═══════════════╩═════════════════════════════╝
    

    USEC_TO_TIMESTAMP(<expr>) 将 UNIX 时间戳(以微秒为单位)转换为 TIMESTAMP 数据类型。

    示例

    SELECT USEC_TO_TIMESTAMP(1349053323000000);

    https://cloud.google.com/bigquery/docs/reference/legacy-sql#usec_to_timestamp

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 2015-03-17
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多