【问题标题】:Bigquery SQL semi monthly date rangeBigquery SQL 半月日期范围
【发布时间】:2017-05-06 02:44:59
【问题描述】:

我有一个需要自动化查询的报告,以便返回的数据范围是半月(1 - 15)(16 - 月底)

因此,如果报告是在每月 1 日生成的,则日期范围是之前月份的 16 日 - 上个月月底。

如果报表在 15 日运行,则范围为当月 1 日 - 15 日。

我打算使用中间。但我需要能够动态生成 date_from 和 date_to 范围的日期。

这样的事情可能吗(也许使用当前日期和一些计算)?

非常感谢您的帮助。

埃里克

【问题讨论】:

    标签: sql date google-bigquery


    【解决方案1】:

    要生成日期范围,您可以使用GENERATE_DATE_ARRAY function。例如,

    SELECT d
    FROM UNNEST(GENERATE_DATE_ARRAY(
                  CURRENT_DATE(),
                  DATE_ADD(CURRENT_DATE(), INTERVAL 14 DAY))) AS d;
    

    请注意,此功能仅在 standard SQL 中可用。

    要生成从当前月份的第一天到 15 号的范围,可以使用 DATE_TRUNC 函数:

    SELECT d
    FROM UNNEST(GENERATE_DATE_ARRAY(
                  DATE_TRUNC(CURRENT_DATE(), MONTH),
                  DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL 15 DAY))) AS d;
    

    【讨论】:

      【解决方案2】:

      您应该能够使用数据库中的函数轻松完成此操作,例如 IF()、DATE_SUB() 和 DATE_FORMAT()。这是一个使用可以在您的示例中使用的示例:

      SELECT * 
      FROM 
      mytable 
      WHERE 
      mydate >= IF( DAY(NOW()) >= 15, 
      DATE_FORMAT(NOW(), '%Y-%m-01'), 
      DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH)), '%Y-%m-16')
      && mydate <= IF( DAY(NOW()) >= 15,
      DATE_FORMAT(NOW(), '%Y-%m-15'),
      LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)) )
      

      *这个例子是MySQL

      【讨论】:

        【解决方案3】:
        DECLARE @FIRST_DAY_OF_CURRENT_MONTH DATE
        
        DECLARE @FIRST_DAY_OF_PRIOR_MONTH DATE
        
        DECLARE @LAST_DAY_OF_PRIOR_MONTH DATE
        
        SET @FIRST_DAY_OF_CURRENT_MONTH =DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)
        
        SET @FIRST_DAY_OF_PRIOR_MONTH =DATEADD(MM,-1,@FIRST_DAY_OF_CURRENT_MONTH)
        
        SET @LAST_DAY_OF_PRIOR_MONTH =DATEADD(MM,DATEDIFF(MM,0,GETDATE()),-1)
        
        IF (DATEPART(DD,GETDATE()) =15)
        
        BEGIN
        
        SELECT * FROM TABLE 
        
        WHERE DATE_COLUMN BETWEEN @FIRST_DAY_OF_CURRENT_MONTH AND 
        
        DATEADD(DD,14,@FIRST_DAY_OF_CURRENT_MONTH)
        
        END
        
        IF(DATEPART(DD,GETDATE()) = 1)
        
        SELECT * FROM TABLE 
        
        WHERE DATE_COLUMN BETWEEN DATEADD(DD,15,@FIRST_DAY_OF_PRIOR_MONTH) AND @LAST_DAY_OF_PRIOR_MONTH
        
        END
        

        【讨论】:

          猜你喜欢
          • 2020-10-05
          • 2018-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多