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_rangemonths_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    

希望这能帮助你前进