【问题标题】: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