Big Query(SQL)在日期(问题)中添加一个月-(Data Studio)

时间:2018-08-15 14:00:25

标签: sql google-bigquery google-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中(可以在任何平台上使用)可以将1月25日至30日与25日进行比较2月-30日,问题是当我在日期30012018上添加1个月时,它变成30022018(您所知道的不存在)

无论如何,我坚持这个想法,但是也许还有其他方法可以做到这一点?再次重复,我需要比较同一日期但不同月份的日期-1月15日-1月-20日与2月15日-2月20日,但还是出现30-31日的问题

2 个答案:

答案 0 :(得分:0)

如果您要在下个月结束,请尝试以下方法

================ RESTART: C:\Users\dell\Desktop\p.e.t.a.r.py ================
Traceback (most recent call last):
  File "C:\Users\dell\Desktop\p.e.t.a.r.py", line 6, in <module>
    txt.grid(column = 0, row = 0, font=("Anurati Regular", 50))
  File "C:\Users\dell\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 2082, in grid_configure
    + self._options(cnf, kw))
_tkinter.TclError: bad option "-font": must be -column, -columnspan, -in, -ipadx, -ipady, -padx, -pady, -row, -rowspan, or -sticky
>>> 

另外,对于您来说-您可能要考虑比较星期几(而不是月份)-这样就避免了28/29和30/31问题

答案 1 :(得分:0)

  

我需要比较两个时间段...

不幸的是,您的问题仍然没有显示出您的用例究竟是什么-因此,下面是尝试根据我所看到的问题的概括来给您一个想法

在下面(对于BigQuery Standard SQL):

  • project.dataset.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    

要使用上述脚本,您可以使用以下脚本来模拟您的真实表,该脚本通过生成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    

如果您想检查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    

希望这将帮助您前进