Bigquery SQL半月日期范围

时间:2016-12-20 19:28:16

标签: sql date google-bigquery

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

因此,如果报告在该月的第一天运行,则日期范围是前一个月的第16个月 - 上个月的结束。

如果报告在15日运行,则范围是当前月1日 - 15日。

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

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

非常感谢帮助。

埃里克

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

您应该可以使用数据库中的函数轻松完成此操作,例如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

答案 2 :(得分:0)

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