Google bigquery 如何将毫秒与日期添加和日期差异一起使用
我尝试在bigquery中使用带日期的毫秒添加函数时遇到了一些困难: 我正在尝试这个SQL,它对我不起作用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
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毫秒的等效值是什么。