Big Query (SQL) 将日期加一个月(问题)- (Data Studio)
Big Query (SQL) Add one month to the date (Issue) - (Data Studio)
目前,我正在通过这种方式增加一个月:
DATE_ADD(date, INTERVAL 1 MONTH) AS pDate
我正在尝试使用相同的日期范围按月比较两个值。所以我制作了另一个日期为 +1 个月的自定义字段,当我使用它时......它缺少 31 天。
6 月 30 日 +1 个月 = 7 月 31 日,当我使用自定义字段时...它缺少日期为 31 的字段
编辑 v1.0
我有一个数据库一年了,每天都呈现。
例如:
01012018
....
31012018
01022018
...
28022018
我需要比较两个时间段并解决这个问题我创建了一个自定义字段,它接受日期并添加 +1 个月,所以在 Data studio 中(可以在任何平台上)可以比较 25-30January对于 2 月 25 日至 30 日,问题是当我在日期 30012018 上加上 1 个月时,它变成了 30022018(如您所知不存在)
无论如何,我坚持这个想法,但也许还有其他方法可以做到这一点?将再次重复,我需要比较相同日期但来自不同月份 - 1 月 15 日 -20 日与 2 月 15 日 - 2 月 20 日,但再次出现第 30-31 日的问题
如果您正在寻找下个月的月底 - 您应该尝试以下
#standardSQL
SELECT DATE_SUB(DATE_TRUNC(DATE_ADD('2018-06-30', INTERVAL 2 MONTH), MONTH), INTERVAL 1 DAY)
此外,在您的情况下 - 您可能需要考虑比较星期几(而不是月份) - 这样您就可以避免 28/29 和 30/31 问题
I need to compare two time period ...
不幸的是,你的问题仍然没有显示你的用例究竟是什么 - 所以下面试图根据我所看到的问题的概括给你一个想法
在下方(对于 BigQuery Standard SQL):
project.dataset.table
是您真正的 table,具有您要比较的日期和指标。
days_range
和 months_range
- 允许您分别设置范围或日期和月份,而无需在主 SELECT 语句中做任何更改
#standardSQL
WITH days_range AS (
SELECT 15 start_day, 20 end_day
), months_range AS (
SELECT 1 start_month, 4 end_month
)
SELECT
CONCAT(CAST(MIN(day_date) AS STRING), ' - ', CAST(MAX(day_date) AS STRING)) interval_days,
SUM(metric) interval_metric
FROM `project.dataset.table`, days_range, months_range
WHERE EXTRACT(DAY FROM day_date) BETWEEN start_day AND end_day
AND EXTRACT(MONTH FROM day_date) BETWEEN start_month AND end_month
GROUP BY DATE_TRUNC(day_date, MONTH)
-- ORDER BY 1
要玩上面的游戏,您可以使用下面的脚本来模拟您的真实 table 通过生成 2018 年的天数以及随机指标
#standardSQL
WITH `project.dataset.table` AS (
SELECT day_date, CAST(100 * RAND() AS INT64) metric
FROM UNNEST(GENERATE_DATE_ARRAY('2018-01-01', '2018-12-31')) day_date
), days_range AS (
SELECT 15 start_day, 20 end_day
), months_range AS (
SELECT 1 start_month, 4 end_month
)
SELECT
CONCAT(CAST(MIN(day_date) AS STRING), ' - ', CAST(MAX(day_date) AS STRING)) interval_days,
SUM(metric) interval_metric
FROM `project.dataset.table`, days_range, months_range
WHERE EXTRACT(DAY FROM day_date) BETWEEN start_day AND end_day
AND EXTRACT(MONTH FROM day_date) BETWEEN start_month AND end_month
GROUP BY DATE_TRUNC(day_date, MONTH)
ORDER BY 1
结果为
Row interval_days interval_metric
1 2018-01-15 - 2018-01-20 244
2 2018-02-15 - 2018-02-20 235
3 2018-03-15 - 2018-03-20 204
4 2018-04-15 - 2018-04-20 355
如果您想检查同一个脚本如何 'behave' 28-30-31 天 - 请尝试以下
#standardSQL
WITH `project.dataset.table` AS (
SELECT day_date, CAST(100 * RAND() AS INT64) metric
FROM UNNEST(GENERATE_DATE_ARRAY('2018-01-01', '2018-12-31')) day_date
), days_range AS (
SELECT 25 start_day, 31 end_day
), months_range AS (
SELECT 1 start_month, 4 end_month
)
SELECT
CONCAT(CAST(MIN(day_date) AS STRING), ' - ', CAST(MAX(day_date) AS STRING)) interval_days,
SUM(metric) interval_metric
FROM `project.dataset.table`, days_range, months_range
WHERE EXTRACT(DAY FROM day_date) BETWEEN start_day AND end_day
AND EXTRACT(MONTH FROM day_date) BETWEEN start_month AND end_month
GROUP BY DATE_TRUNC(day_date, MONTH)
ORDER BY 1
结果
Row interval_days interval_metric
1 2018-01-25 - 2018-01-31 364
2 2018-02-25 - 2018-02-28 227
3 2018-03-25 - 2018-03-31 311
4 2018-04-25 - 2018-04-30 308
希望这能帮助你前进
目前,我正在通过这种方式增加一个月:
DATE_ADD(date, INTERVAL 1 MONTH) AS pDate
我正在尝试使用相同的日期范围按月比较两个值。所以我制作了另一个日期为 +1 个月的自定义字段,当我使用它时......它缺少 31 天。
6 月 30 日 +1 个月 = 7 月 31 日,当我使用自定义字段时...它缺少日期为 31 的字段
编辑 v1.0
我有一个数据库一年了,每天都呈现。
例如:
01012018
....
31012018
01022018
...
28022018
我需要比较两个时间段并解决这个问题我创建了一个自定义字段,它接受日期并添加 +1 个月,所以在 Data studio 中(可以在任何平台上)可以比较 25-30January对于 2 月 25 日至 30 日,问题是当我在日期 30012018 上加上 1 个月时,它变成了 30022018(如您所知不存在)
无论如何,我坚持这个想法,但也许还有其他方法可以做到这一点?将再次重复,我需要比较相同日期但来自不同月份 - 1 月 15 日 -20 日与 2 月 15 日 - 2 月 20 日,但再次出现第 30-31 日的问题
如果您正在寻找下个月的月底 - 您应该尝试以下
#standardSQL
SELECT DATE_SUB(DATE_TRUNC(DATE_ADD('2018-06-30', INTERVAL 2 MONTH), MONTH), INTERVAL 1 DAY)
此外,在您的情况下 - 您可能需要考虑比较星期几(而不是月份) - 这样您就可以避免 28/29 和 30/31 问题
I need to compare two time period ...
不幸的是,你的问题仍然没有显示你的用例究竟是什么 - 所以下面试图根据我所看到的问题的概括给你一个想法
在下方(对于 BigQuery Standard SQL):
project.dataset.table
是您真正的 table,具有您要比较的日期和指标。days_range
和months_range
- 允许您分别设置范围或日期和月份,而无需在主 SELECT 语句中做任何更改
#standardSQL
WITH days_range AS (
SELECT 15 start_day, 20 end_day
), months_range AS (
SELECT 1 start_month, 4 end_month
)
SELECT
CONCAT(CAST(MIN(day_date) AS STRING), ' - ', CAST(MAX(day_date) AS STRING)) interval_days,
SUM(metric) interval_metric
FROM `project.dataset.table`, days_range, months_range
WHERE EXTRACT(DAY FROM day_date) BETWEEN start_day AND end_day
AND EXTRACT(MONTH FROM day_date) BETWEEN start_month AND end_month
GROUP BY DATE_TRUNC(day_date, MONTH)
-- ORDER BY 1
要玩上面的游戏,您可以使用下面的脚本来模拟您的真实 table 通过生成 2018 年的天数以及随机指标
#standardSQL
WITH `project.dataset.table` AS (
SELECT day_date, CAST(100 * RAND() AS INT64) metric
FROM UNNEST(GENERATE_DATE_ARRAY('2018-01-01', '2018-12-31')) day_date
), days_range AS (
SELECT 15 start_day, 20 end_day
), months_range AS (
SELECT 1 start_month, 4 end_month
)
SELECT
CONCAT(CAST(MIN(day_date) AS STRING), ' - ', CAST(MAX(day_date) AS STRING)) interval_days,
SUM(metric) interval_metric
FROM `project.dataset.table`, days_range, months_range
WHERE EXTRACT(DAY FROM day_date) BETWEEN start_day AND end_day
AND EXTRACT(MONTH FROM day_date) BETWEEN start_month AND end_month
GROUP BY DATE_TRUNC(day_date, MONTH)
ORDER BY 1
结果为
Row interval_days interval_metric
1 2018-01-15 - 2018-01-20 244
2 2018-02-15 - 2018-02-20 235
3 2018-03-15 - 2018-03-20 204
4 2018-04-15 - 2018-04-20 355
如果您想检查同一个脚本如何 'behave' 28-30-31 天 - 请尝试以下
#standardSQL
WITH `project.dataset.table` AS (
SELECT day_date, CAST(100 * RAND() AS INT64) metric
FROM UNNEST(GENERATE_DATE_ARRAY('2018-01-01', '2018-12-31')) day_date
), days_range AS (
SELECT 25 start_day, 31 end_day
), months_range AS (
SELECT 1 start_month, 4 end_month
)
SELECT
CONCAT(CAST(MIN(day_date) AS STRING), ' - ', CAST(MAX(day_date) AS STRING)) interval_days,
SUM(metric) interval_metric
FROM `project.dataset.table`, days_range, months_range
WHERE EXTRACT(DAY FROM day_date) BETWEEN start_day AND end_day
AND EXTRACT(MONTH FROM day_date) BETWEEN start_month AND end_month
GROUP BY DATE_TRUNC(day_date, MONTH)
ORDER BY 1
结果
Row interval_days interval_metric
1 2018-01-25 - 2018-01-31 364
2 2018-02-25 - 2018-02-28 227
3 2018-03-25 - 2018-03-31 311
4 2018-04-25 - 2018-04-30 308
希望这能帮助你前进