Google bigquery 如何将毫秒与日期添加和日期差异一起使用

Google bigquery 如何将毫秒与日期添加和日期差异一起使用,google-bigquery,Google Bigquery,我尝试在bigquery中使用带日期的毫秒添加函数时遇到了一些困难: 我正在尝试这个SQL,它对我不起作用 DATE_ADD(MILLISECOND,-1,LEAD(dt) OVER (PARTITION BY xy ORDER BY dt ASC) 还正在寻找DATE\u DIFF函数的解决方案 非常感谢您的帮助。这是一个使用DATETIME\u ADD SELECT *, DATETIME_DIFF(seq_date,LEAD_DT, HOUR) FROM (SELECT *, RAN

我尝试在bigquery中使用带日期的毫秒添加函数时遇到了一些困难:

我正在尝试这个SQL,它对我不起作用

DATE_ADD(MILLISECOND,-1,LEAD(dt) OVER (PARTITION BY xy ORDER BY dt ASC)
还正在寻找
DATE\u DIFF
函数的解决方案


非常感谢您的帮助。

这是一个使用
DATETIME\u ADD

SELECT *, DATETIME_DIFF(seq_date,LEAD_DT, HOUR) FROM  
(SELECT *, RANK() OVER (PARTITION BY ID ORDER BY seq_date) AS RNK,
DATETIME_ADD((LEAD(seq_date) OVER (PARTITION BY ID ORDER BY seq_date)) ,INTERVAL 3 HOUR) LEAD_DT
FROM 
(select 1 as id, CURRENT_DATETIME() as seq_date, 10 as cost
union ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL -10 MINUTE ) as seq_date, 12 as cost
UNION ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL -1 HOUR ) as seq_date, 13 as cost
UNION ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 5 HOUR ) as seq_date, 20 as cost));
SELECT *, DATE_DIFF(seq_date,LEAD_DT, DAY) FROM  
(SELECT *, RANK() OVER (PARTITION BY ID ORDER BY seq_date) AS RNK,
DATE_ADD((LEAD(seq_date) OVER (PARTITION BY ID ORDER BY seq_date)) ,INTERVAL 3 DAY) LEAD_DT
FROM 
(select 1 as id, CURRENT_DATE() as seq_date, 10 as cost
union ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL -10 DAY ) as seq_date, 12 as cost
UNION ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY ) as seq_date, 13 as cost
UNION ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL 5 DAY ) as seq_date, 20 as cost));

这是一个使用
DATE\u ADD

SELECT *, DATETIME_DIFF(seq_date,LEAD_DT, HOUR) FROM  
(SELECT *, RANK() OVER (PARTITION BY ID ORDER BY seq_date) AS RNK,
DATETIME_ADD((LEAD(seq_date) OVER (PARTITION BY ID ORDER BY seq_date)) ,INTERVAL 3 HOUR) LEAD_DT
FROM 
(select 1 as id, CURRENT_DATETIME() as seq_date, 10 as cost
union ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL -10 MINUTE ) as seq_date, 12 as cost
UNION ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL -1 HOUR ) as seq_date, 13 as cost
UNION ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 5 HOUR ) as seq_date, 20 as cost));
SELECT *, DATE_DIFF(seq_date,LEAD_DT, DAY) FROM  
(SELECT *, RANK() OVER (PARTITION BY ID ORDER BY seq_date) AS RNK,
DATE_ADD((LEAD(seq_date) OVER (PARTITION BY ID ORDER BY seq_date)) ,INTERVAL 3 DAY) LEAD_DT
FROM 
(select 1 as id, CURRENT_DATE() as seq_date, 10 as cost
union ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL -10 DAY ) as seq_date, 12 as cost
UNION ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY ) as seq_date, 13 as cost
UNION ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL 5 DAY ) as seq_date, 20 as cost));

有关更多详细信息,请参见下文

这是一个使用
DATETIME\u ADD

SELECT *, DATETIME_DIFF(seq_date,LEAD_DT, HOUR) FROM  
(SELECT *, RANK() OVER (PARTITION BY ID ORDER BY seq_date) AS RNK,
DATETIME_ADD((LEAD(seq_date) OVER (PARTITION BY ID ORDER BY seq_date)) ,INTERVAL 3 HOUR) LEAD_DT
FROM 
(select 1 as id, CURRENT_DATETIME() as seq_date, 10 as cost
union ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL -10 MINUTE ) as seq_date, 12 as cost
UNION ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL -1 HOUR ) as seq_date, 13 as cost
UNION ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 5 HOUR ) as seq_date, 20 as cost));
SELECT *, DATE_DIFF(seq_date,LEAD_DT, DAY) FROM  
(SELECT *, RANK() OVER (PARTITION BY ID ORDER BY seq_date) AS RNK,
DATE_ADD((LEAD(seq_date) OVER (PARTITION BY ID ORDER BY seq_date)) ,INTERVAL 3 DAY) LEAD_DT
FROM 
(select 1 as id, CURRENT_DATE() as seq_date, 10 as cost
union ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL -10 DAY ) as seq_date, 12 as cost
UNION ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY ) as seq_date, 13 as cost
UNION ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL 5 DAY ) as seq_date, 20 as cost));

这是一个使用
DATE\u ADD

SELECT *, DATETIME_DIFF(seq_date,LEAD_DT, HOUR) FROM  
(SELECT *, RANK() OVER (PARTITION BY ID ORDER BY seq_date) AS RNK,
DATETIME_ADD((LEAD(seq_date) OVER (PARTITION BY ID ORDER BY seq_date)) ,INTERVAL 3 HOUR) LEAD_DT
FROM 
(select 1 as id, CURRENT_DATETIME() as seq_date, 10 as cost
union ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL -10 MINUTE ) as seq_date, 12 as cost
UNION ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL -1 HOUR ) as seq_date, 13 as cost
UNION ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 5 HOUR ) as seq_date, 20 as cost));
SELECT *, DATE_DIFF(seq_date,LEAD_DT, DAY) FROM  
(SELECT *, RANK() OVER (PARTITION BY ID ORDER BY seq_date) AS RNK,
DATE_ADD((LEAD(seq_date) OVER (PARTITION BY ID ORDER BY seq_date)) ,INTERVAL 3 DAY) LEAD_DT
FROM 
(select 1 as id, CURRENT_DATE() as seq_date, 10 as cost
union ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL -10 DAY ) as seq_date, 12 as cost
UNION ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY ) as seq_date, 13 as cost
UNION ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL 5 DAY ) as seq_date, 20 as cost));
有关更多详细信息,请参见下文

需要日期部分作为参数。你可以用这个。这对我有用:

DATETIME_ADD(LEAD(validfrom) OVER (PARTITION BY xy ORDER BY validfrom ASC), INTERVAL -1 MILLISECOND) as validto
玩一些虚拟数据:

WITH test_table as
(
    SELECT 1 AS xy, CURRENT_DATETIME() AS validfrom UNION ALL
    SELECT 1 AS xy, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 1 MINUTE ) AS validfrom UNION ALL
    SELECT 1 AS xy, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 2 MINUTE ) AS validfrom UNION ALL
    SELECT 1 AS xy, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 3 MINUTE ) AS validfrom
)
SELECT
  *,
  DATETIME_ADD(LEAD(validfrom) OVER (PARTITION BY xy ORDER BY validfrom ASC), INTERVAL -1 MILLISECOND) as validto
FROM test_table;
结果是:

Row xy  validfrom                   validto  
1   1   2019-03-18T15:06:18.086840  2019-03-18T15:07:18.085840   
2   1   2019-03-18T15:07:18.086840  2019-03-18T15:08:18.085840   
3   1   2019-03-18T15:08:18.086840  2019-03-18T15:09:18.085840   
4   1   2019-03-18T15:09:18.086840  null    
请注意,
validto
字段比下一行的
validfrom
早1毫秒,这应该是预期结果。

需要日期部分作为参数。你可以用这个。这对我有用:

DATETIME_ADD(LEAD(validfrom) OVER (PARTITION BY xy ORDER BY validfrom ASC), INTERVAL -1 MILLISECOND) as validto
玩一些虚拟数据:

WITH test_table as
(
    SELECT 1 AS xy, CURRENT_DATETIME() AS validfrom UNION ALL
    SELECT 1 AS xy, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 1 MINUTE ) AS validfrom UNION ALL
    SELECT 1 AS xy, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 2 MINUTE ) AS validfrom UNION ALL
    SELECT 1 AS xy, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 3 MINUTE ) AS validfrom
)
SELECT
  *,
  DATETIME_ADD(LEAD(validfrom) OVER (PARTITION BY xy ORDER BY validfrom ASC), INTERVAL -1 MILLISECOND) as validto
FROM test_table;
结果是:

Row xy  validfrom                   validto  
1   1   2019-03-18T15:06:18.086840  2019-03-18T15:07:18.085840   
2   1   2019-03-18T15:07:18.086840  2019-03-18T15:08:18.085840   
3   1   2019-03-18T15:08:18.086840  2019-03-18T15:09:18.085840   
4   1   2019-03-18T15:09:18.086840  null    

请注意,
validto
字段比下一行的
validfrom
早1毫秒,这应该是预期的结果。

您能说明此查询的目标是什么吗?样本数据?想要的结果?对不起,没有早点说清楚。我试图找到dt(validfrom)字段的前导值和毫秒数的-1,并将其作为validto加载到一个新的dt字段。当我在上面的部分中使用毫秒时,我得到了一个错误。我想知道在DATE\u ADD函数中,SQL毫秒和BQ毫秒的等效值是多少。你能说明一下这个查询的目的是什么吗?样本数据?想要的结果?对不起,没有早点说清楚。我试图找到dt(validfrom)字段的前导值和毫秒数的-1,并将其作为validto加载到一个新的dt字段。当我在上面的部分中使用毫秒时,我得到了一个错误。我试图弄清楚在DATE\u ADD函数中,SQL毫秒与BQ毫秒的等效值是什么。